function Gadget(name, color)
{
this.name = name;
this.color = color;
}
Gadget.prototype.rating = 3
var newtoy = new Gadget("webcam", "black")
newtoy.constructor.prototype.constructor.prototype.constructor.prototype
Itu selalu mengembalikan objek dengan rating = 3.
Tetapi jika saya melakukan hal berikut:
newtoy.__proto__.__proto__.__proto__
Rantai itu akhirnya kembali null
.
Juga di Internet Explorer bagaimana saya akan memeriksa null jika tidak ada __proto__
properti?
javascript
inheritance
prototype-programming
xdevel2000
sumber
sumber
newtoy.prototype
tidak sama dengannewtoy.constructor.prototype
dan karenanyanewtoy.constructor.prototype
tidak akan memiliki properti yang dipanggilrating
. Demikian pula,newtoy.constructor.prototype.constructor.property
properti tidak akan dipanggilrating
.newtoy.constructor.prototype
akan memiliki properti yang disebut peringkat. Demikian pulanewtoy.constructor.prototype.constructor.property
akan memiliki peringkat properti yang disebut.__proto__
Vs.prototype
dalam JavaScript dan Bagaimana cara.prototype
kerja JavaScript ?Jawaban:
Saya sudah mencoba untuk membungkus kepala saya di sekitar ini baru-baru ini dan akhirnya muncul dengan "peta" ini yang saya pikir menjelaskan sepenuhnya tentang masalah ini
http://i.stack.imgur.com/KFzI3.png
Saya tahu saya bukan yang pertama mengada-ada tetapi lebih menarik untuk mengetahuinya dengan menemukannya :-). Lagi pula, setelah itu saya menemukan misalnya ini diagram lain yang saya pikir mengatakan pada dasarnya sama:
Tata letak objek Javascript
Hal yang paling mengejutkan bagi saya adalah menemukan
Object.__proto__
hal ituFunction.prototype
, alih-alihObject.prototype
, tapi saya yakin ada alasan bagus untuk itu :-)Saya menempelkan kode yang disebutkan dalam gambar di sini juga karena jika ada yang ingin mengujinya. Perhatikan bahwa beberapa properti ditambahkan ke objek untuk memudahkan mengetahui di mana kita setelah beberapa lompatan:
sumber
Object.__proto__
menunjukFunction.prototype
adalah karenaObject()
dengan sendirinya adalah fungsi asli yang instantiates objek kosong. Karena itu,Object()
adalah suatu fungsi. Anda akan menemukan bahwa semua__proto__
properti tipe asli utama lainnya mengarah keFunction.prototype
.Object
,Function
,String
,Number
, DanArray
semua mewarisi Fungsi prototipe.Object
itu sendiri adalah fungsi; hasil dari mengeksekusi callableObject
(yaitu, nilai balik dari menjalankanObject()
) bukan suatu fungsi.constructor
adalah properti [[DontEnum]] yang telah ditentukan sebelumnya dari objek yang ditunjuk olehprototype
properti dari objek fungsi dan pada awalnya akan menunjuk ke objek fungsi itu sendiri.__proto__
setara dengan properti [[Prototipe]] internal suatu objek, yaitu prototipe aslinya.Saat Anda membuat objek dengan
new
operator, properti [[Prototipe]] internalnya akan ditetapkan ke objek yang ditunjuk olehprototype
properti fungsi konstruktor .Ini berarti bahwa
.constructor
akan mengevaluasi.__proto__.constructor
, yaitu fungsi konstruktor yang digunakan untuk membuat objek, dan seperti yang telah kita pelajari,protoype
properti fungsi ini digunakan untuk mengatur objek [[Prototipe]] objek.Itu mengikuti yang
.constructor.prototype.constructor
identik dengan.constructor
(selama properti ini belum ditimpa); lihat di sini untuk penjelasan lebih rinci.Jika
__proto__
tersedia, Anda dapat berjalan di rantai prototipe objek yang sebenarnya. Tidak ada cara untuk melakukan ini di ECMAScript3 karena JavaScript tidak dirancang untuk hierarki warisan yang mendalam.sumber
.constructor.prototype
rantai. Saya juga tidak jelas untuk saya, sementara saya tidak melihat itu.constructor
setara.__proto__.constructor
. Yang berarti bersepeda antara fungsi konstruktor dan prototipe itu.Warisan Prototypal dalam JavaScript didasarkan pada
__proto__
properti dalam arti bahwa setiap objek mewarisi konten objek yang direferensikan oleh__proto__
propertinya.The
prototype
properti khusus hanya untukFunction
objek dan hanya ketika menggunakannew
operator untuk memanggilFunction
sebagai konstruktor. Dalam hal ini, objek yang dibuat__proto__
akan diatur ke konstruktorFunction.prototype
.Ini berarti bahwa menambahkan ke
Function.prototype
akan secara otomatis mencerminkan semua objek yang__proto__
mereferensikanFunction.prototype
.Mengganti konstruktor
Function.prototype
dengan objek lain tidak akan diperbarui__proto__
properti untuk objek yang sudah ada.Perhatikan bahwa
__proto__
properti tidak boleh diakses secara langsung, Object.getPrototypeOf (objek) harus digunakan sebagai gantinya.Untuk menjawab pertanyaan pertama, saya telah membuat diagram
__proto__
danprototype
referensi yang dipesan lebih dahulu , sayangnya stackoverflow tidak memungkinkan saya untuk menambahkan gambar dengan "kurang dari 10 reputasi". Mungkin lain kali.[Sunting] Angka tersebut digunakan
[[Prototype]]
sebagai ganti__proto__
karena itu adalah bagaimana spesifikasi ECMAScript merujuk ke objek internal. Saya harap Anda bisa memikirkan semuanya.Berikut adalah beberapa petunjuk untuk membantu Anda memahami angka tersebut:
Perhatikan bahwa
constructor
properti tidak ada di objek yang dibuat, tetapi diwarisi dari prototipe.sumber
new MyFunction()
membuat instance objek yang__proto__
seharusnya merujuk pada prototipe ctor-nya yangMyFunction.prototype.
Jadi mengapaMyFunction.prototype.__proto__
merujukObject.prototype
? itu harus merujuk (seperti sampel pertama saya) ke prototipeMyFunction.prototype
MyFunction.prototype
Myfunction
Object
adalah Hawa, danFunction
Adam, Adam (Function
) menggunakan tulangnya (Function.prototype
) untuk membuat Hawa (Object
). Lalu siapa yang menciptakan Adam (Function
)? - Penemu bahasa JavaScript :-).Menurut jawaban utsaina, saya ingin menambahkan info yang lebih berguna.
Seharusnya TIDAK.
Object.__proto__
seharusnya TIDAK menunjuk keObject.prototype
. Sebaliknya, contoh dariObject
o
,o.__proto__
harus menunjuk keObject.prototype
.(Maafkan saya karena menggunakan ketentuan
class
daninstance
dalam JavaScript, tetapi Anda tahu itu :-)Saya pikir kelas
Object
itu sendiri adalah contoh dariFunction
, itu sebabnyaObject.__proto__ === Function.prototype
. Karena itu:Object
adalah Hawa, danFunction
Adam, Adam (Function
) menggunakan tulangnya (Function.prototype
) untuk membuat Hawa (Object
).Lebih jauh, bahkan kelas
Function
itu sendiri adalah turunan dariFunction
dirinya sendiri, yaituFunction.__proto__ === Function.prototype
sebabnyaFunction === Function.constructor
Lebih jauh lagi, kelas reguler
Cat
adalah turunan dariFunction
, yaituCat.__proto__ === Function.prototype
.Alasan di atas adalah, ketika kita membuat kelas dalam JavaScript, sebenarnya, kita hanya membuat fungsi, yang seharusnya menjadi instance dari
Function
.Object
danFunction
hanya istimewa, tetapi mereka masih kelas, sedangkanCat
kelas reguler.Faktanya, di mesin Google Chrome JavaScript, berikut 4:
Function.prototype
Function.__proto__
Object.__proto__
Cat.__proto__
Mereka semua
===
(sama dengan) 3 lainnya, dan nilainyafunction Empty() {}
BAIK. Lalu siapa yang menciptakan special
function Empty() {}
(Function.prototype
)? Pikirkan tentang itu :-)sumber
function Empty() {}
Anda maksud dengan menyamakan dengan Function.prototype, dll?, Kode apa yang Anda gunakan di konsol chrome?function Empty() {}
di Google Chrome. Saya juga menambahkan output konsol._ _proto_ _
) dari Function.protot. Sesederhana itu :)Saya benar-benar tidak tahu mengapa orang tidak mengoreksi Anda tentang di mana sebenarnya masalah dalam pemahaman Anda.
Ini akan membuat Anda lebih mudah menemukan masalah
Jadi mari kita lihat apa yang terjadi:
Bagus, jadi sekarang mari kita lihat ini
__proto__
Sebelum itu, harap diingat 2 hal mengenai
__proto__
:Ketika Anda membuat objek dengan
new
operator, internal[[Prototype]]
/proto__
propertinya akan disetel keprototype
properti (1)constructor function
atau "penciptanya" jika Anda mau.Kode keras dalam JS -:
Object.prototype.__proto__
isnull
.Mari kita lihat 2 poin ini sebagai "
bill
"Lebih baik?
sumber
Setiap fungsi menciptakan prototipe itu. Dan ketika kita membuat objek menggunakan konstruktor fungsi itu, maka properti __proto__ dari objek saya akan mulai menunjuk ke prototipe fungsi itu.
sumber
__proto__
properti itu.Jika semua angka itu luar biasa, mari kita lihat apa artinya properti.
STH.prototype
Saat membuat fungsi baru, ada objek kosong yang dibuat secara paralel dan ditautkan ke fungsi dengan
[[Prototype]]
rantai. Untuk mengakses objek ini, kami menggunakanprototype
properti fungsi.Ingatlah bahwa
prototype
properti hanya tersedia untuk fungsi.STH.constructor
Objek prototipe yang disebutkan di atas tidak memiliki properti kecuali satu -
constructor
. Properti ini mewakili fungsi yang membuat objek prototipe.Saat membuat
Gadget
fungsi, kami juga membuat objek{constructor: Gadget}
- tidak seperti ituGadget.prototype
. Sebagaiconstructor
mengacu pada fungsi yang menciptakan sebuah prototipe objek,toy.constructor
merupakanGadget
fungsi. Kami menulistoy.constructor.prototype
dan menerima{constructor: Gadget}
lagi.Oleh karena itu, ada lingkaran setan: Anda dapat menggunakan
toy.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype
dan itu akan selalu terjadiGadget.prototype
.STH .__ proto__
Sementara
prototype
adalah properti khusus untuk fungsi,__proto__
tersedia untuk semua objek saat diletakkanObject.prototype
. Ini mengacu pada prototipe fungsi yang dapat membuat objek.Ini
toy.__proto__
diaGadget.prototype
. Seperti halnyaGadget.prototype
objek ({}
) dan objek dibuat denganObject
fungsi (lihat contoh di atas), kita dapatkanObject.prototype
. Ini adalah objek yang lebih tinggi dalam JavaScript dan__proto__
hanya dapat menunjukkannull
.sumber
Jawaban singkat:
__proto__
adalah referensi keprototype
properti konstruktor yang menciptakan objek.Objek dalam JavaScript
Objek JavaScript adalah tipe bawaan untuk koleksi sifat nol atau lebih. Properti adalah wadah yang menampung benda lain, nilai primitif, atau fungsi.
Konstruktor dalam JavaScript
Fungsi adalah objek biasa (yang menerapkan
[[Call]]
dalam istilah ECMA-262) dengan kemampuan tambahan untuk dipanggil tetapi memainkan peran lain dalam JavaScript: mereka menjadi konstruktor ( pabrik untuk objek) jika dipanggil melaluinew
operator. Konstruktor merupakan analog kasar ke kelas dalam bahasa lain.Setiap fungsi JavaScript sebenarnya adalah instance dari
Function
objek fungsi bawaan yang memiliki properti khusus bernama yangprototype
digunakan untuk mengimplementasikan warisan berbasis prototipe dan properti bersama. Setiap objek yang dibuat oleh fungsi konstruktor memiliki referensi implisit (disebut prototipe atau__proto__
) dengan nilai konstruktornyaprototype
.Konstruktor
prototype
adalah semacam cetak biru untuk membangun objek karena setiap objek yang dibuat oleh konstruktor mewarisi referensi untuk ituprototype
.Rantai prototipe
Objek menentukan prototipe melalui properti internal
[[Prototype]]
atau__proto__
. Hubungan prototipe antara dua objek adalah tentang warisan: setiap objek dapat memiliki objek lain sebagai prototipe. Prototipe mungkinnull
nilainya.Rantai benda yang dihubungkan oleh
__proto__
properti disebut rantai prototipe . Ketika referensi dibuat untuk properti di objek, referensi itu adalah properti yang ditemukan di objek pertama dalam rantai prototipe yang berisi properti dari nama itu. Rantai prototipe berperilaku seolah-olah itu adalah objek tunggal.Lihat gambar ini (diekstrak dari blog ini ):
Setiap kali Anda mencoba mengakses properti di suatu objek, JavaScript memulai pencariannya di objek itu dan melanjutkan dengan prototipe, prototipe prototipe, dan seterusnya hingga properti ditemukan atau jika
__proto__
memiliki nilainull
.Hampir semua objek adalah instance dari
Object
, karenaObject.prototype
terakhir dalam rantai prototipe mereka TetapiObject.prototype
ini bukan contohObject
karenaObject.prototype.__proto__
memegang nilainull
.Anda juga dapat membuat objek dengan
null
prototipe seperti ini:Benda seperti adalah peta yang lebih baik (kamus) dari objek literal, yang mengapa pola ini kadang-kadang disebut dict pola ( dict kamus).
Catatan: literal objek yang dibuat menggunakan
{}
adalah contohObject
karena({}).__proto__
merupakan acuan untukObject.prototype
.sumber