Gambar ini kembali menunjukkan bahwa setiap objek memiliki prototipe. Fungsi konstruktor Foo juga memiliki fungsi sendiri
__proto__
yaitu Function.prototype, dan yang pada gilirannya juga merujuk melalui__proto__
propertinya lagi ke Object.prototype. Jadi, ulangi, Foo.prototype hanyalah properti eksplisit Foo yang mengacu pada prototipe objek b dan c.
var b = new Foo(20);
var c = new Foo(30);
Apa perbedaan antara __proto__
dan prototype
?
Sosok itu diambil dari dmitrysoshnikov.com .
__proto__
berbeda dariconstructor.prototype
?Jawaban:
__proto__
adalah objek aktual yang digunakan dalam rantai pencarian untuk menyelesaikan metode, dll.prototype
adalah objek yang digunakan untuk membangun__proto__
saat Anda membuat objek dengannew
:sumber
prototype
tidak tersedia pada instance sendiri (atau objek lain), tetapi hanya pada fungsi konstruktor.prototype
hanya tersedia pada fungsi karena mereka berasal dariFunction
,Function
, danObject
tetapi dalam hal lain tidak. Namun,__proto__
tersedia di mana-mana.__proto__
adalah objek aktual yang disimpan dan digunakan sebagai prototipe sementaraMyconstructure.prototype
hanya cetak biru__proto__
yang infact objek aktual disimpan dan digunakan sebagai protoype. Oleh karena itumyobject.prototype
tidak akan menjadi properti dari objek yang sebenarnya karena itu hanya hal sementara yang digunakan oleh fungsi konstruktor untuk menjabarkan seperti apamyobject.__proto__
seharusnya.__proto__
properti suatu objek adalah penunjuk keprototype
properti fungsi konstruktor objek ? yaitu foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ISCar.prototype
, bukan turunan dariCar.prototype
. SedangkanCar.protoype
IS adalah contoh dari sebuahobject
.Car.prototype
bukanlah sesuatu yang memberikannewCar
setiap sifat atau struktur, itu hanya IS berikutnyaobject
dinewCar
's rantai prototipe.Car.prototype
bukan sementaraobject
. Ini adalahobject
yang ditetapkan sebagai nilai__proto__
properti dari setiap yang baruobject
dibuat menggunakanCar
sebagaiconstructor
. Jika Anda ingin menganggap sesuatu sebagai cetak biruobject
, anggapCar
sebagai cetak biru untuk mobil baruobject
.prototype
adalah properti dari objek Function. Ini adalah prototipe objek yang dibangun oleh fungsi itu.__proto__
adalah properti internal dari suatu objek, menunjuk pada prototipe-nya. Standar saat ini menyediakanObject.getPrototypeOf(O)
metode yang setara , meskipun standar de facto__proto__
lebih cepat.Anda dapat menemukan
instanceof
hubungan dengan membandingkan fungsiprototype
ke__proto__
rantai objek, dan Anda dapat memutus hubungan ini dengan mengubahprototype
.Berikut
Point
adalah fungsi konstruktor, ia membangun objek (struktur data) secara prosedural.myPoint
adalah objek yang dibangun olehPoint()
karenaPoint.prototype
itu disimpanmyPoint.__proto__
pada saat itu.sumber
__proto__
properti suatu objek, itu mengubah objek di mana pencarian prototipe dilakukan. Misalnya, Anda dapat menambahkan objek metode sebagai fungsi__proto__
untuk memiliki semacam objek instance yang bisa dipanggil.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call bukan fungsi. Saya lakukanobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
Properti prototipe dibuat ketika suatu fungsi dideklarasikan.
Contohnya:
Person.prototype
properti dibuat secara internal setelah Anda mendeklarasikan fungsi di atas. Banyak properti dapat ditambahkan ke Person.prototype yang dibagikan oleh instance Person yang dibuat menggunakan Person baru ().Perlu dicatat bahwa
Person.prototype
ini adalahObject
literal secara default (dapat diubah sesuai kebutuhan).Setiap instance yang dibuat menggunakan
new Person()
memiliki__proto__
properti yang menunjuk kePerson.prototype
. Ini adalah rantai yang digunakan untuk melintasi untuk menemukan properti dari objek tertentu.membuat 2 instance
Person
, 2 objek ini dapat memanggilage
metodePerson.prototype
asperson1.age
,person2.age
.Pada gambar di atas dari pertanyaan Anda, Anda dapat melihat bahwa itu
Foo
adalahFunction Object
dan oleh karena itu ia memiliki__proto__
tautanFunction.prototype
yang pada gilirannya adalah contoh dariObject
dan memiliki__proto__
tautan keObject.prototype
. Link proto berakhir di sini dengan__proto__
diObject.prototype
menunjuk kenull
.Objek apa pun dapat memiliki akses ke semua properti dalam rantai proto sebagaimana ditautkan olehnya
__proto__
, sehingga membentuk dasar untuk pewarisan prototipal.__proto__
bukan cara standar untuk mengakses rantai prototipe, standar tetapi pendekatan yang serupa digunakanObject.getPrototypeOf(obj)
.Kode di bawah ini untuk
instanceof
operator memberikan pemahaman yang lebih baik:objek
instanceof
Kelas operator kembalitrue
ketika suatu objek adalah turunan dari Kelas, lebih khusus jikaClass.prototype
ditemukan dalam rantai proto objek itu maka objek adalah turunan dari Kelas itu.Metode di atas dapat disebut sebagai:
instanceOf.call(object, Class)
yang mengembalikan true jika objek adalah turunan dari Kelas.sumber
prototype
objek dibuat secara internal? Bisa satu hanya menetapkan metode statis ke objek fungsi itu sendiri. misalnyafunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? Mengapa cara ini tidak dipilih daripada menambahkan metode keprototype
objek? Ini akan bekerja jika dif.__proto__ = g
mana g adalah kelas dasar.prototype
objek dipilih untuk dibagikan karena hanya properti konstruktor fungsi eksklusif yang dapat disimpan dalam objek konstruktor fungsi.instanceof
akan menghasilkan({}) instanceof Function === true
karena tidak akan ada cara untuk membedakan antara prototipe jikaprototype
properti dihapus.new
kata kunci untuk membuat instance, properti dan metode tidak akan disalin lebih.Cara yang baik untuk memikirkannya adalah ...
prototype
digunakan olehconstructor()
fungsi. Seharusnya benar-benar disebut sesuatu seperti"prototypeToInstall"
,, karena memang begitu.dan
__proto__
apakah "prototipe terpasang" pada objek (yang dibuat / diinstal pada objek dariconstructor()
fungsi tersebut)sumber
constructor()
fungsi" menjadi "fungsi konstruktor", karena mungkin ada kebingungan dengan "__proto__.constructor()
fungsi". Saya menganggap ini penting, karena __proto __. Constructor sebenarnya tidak dipanggil ketikanew
kata kunci digunakan.Untuk menjelaskan, mari kita membuat fungsi
Ketika JavaScript mengeksekusi kode ini, ia menambahkan
prototype
properti kea
,prototype
properti adalah objek dengan dua properti:constructor
__proto__
Jadi ketika kita melakukannya
a.prototype
ia kembaliSekarang seperti yang Anda lihat
constructor
hanyalah fungsia
itu sendiri dan__proto__
menunjuk ke tingkat rootObject
JavaScript.Mari kita lihat apa yang terjadi ketika kita menggunakan
a
fungsi dengannew
kata kunci.Ketika JavaScript mengeksekusi kode ini, ia melakukan 4 hal:
__proto__
padab
dan membuatnya menunjuk kea.prototype
sehinggab.__proto__ === a.prototype
a.prototype.constructor
(yang merupakan definisi fungsia
) dengan objek yang baru dibuat (dibuat pada langkah # 1) sebagai konteksnya (ini), makaname
properti dilewatkan sebagai 'JavaScript' (yang ditambahkan kethis
) akan ditambahkan ke objek yang baru dibuat.b
akan ditugaskan ke objek yang baru dibuat.Sekarang jika kita menambah
a.prototype.car = "BMW"
dan melakukannyab.car
, output "BMW" muncul.ini karena ketika JavaScript mengeksekusi kode ini di mana ia mencari
car
propertib
, itu tidak menemukan kemudian JavaScript digunakanb.__proto__
(yang dibuat untuk menunjuk ke 'a.prototype' pada langkah # 2) dan menemukancar
properti jadi kembalikan "BMW".sumber
constructor
tidak kembalia()
! Ia kembalia
. 2.__proto__
mengembalikanObject.prototype
, bukan objek root di Javascript.Prototipe VS. __proto__ VS. [[Prototipe]]
Saat membuat fungsi, objek properti yang disebut prototipe sedang dibuat secara otomatis (Anda tidak membuatnya sendiri) dan sedang dilampirkan ke objek fungsi (itu
constructor
).Catatan : Prototipe baru ini Objek juga menunjuk ke, atau memiliki tautan internal-pribadi ke, Obyek JavaScript asli.
Contoh:
Jika Anda membuat objek baru
Foo
dengan menggunakannew
kata kunci, pada dasarnya Anda membuat (antara lain) objek baru yang memiliki tautan internal atau pribadi keFoo
prototipe fungsi yang telah kita bahas sebelumnya:Hubungan pribadi dengan objek fungsi itu disebut prototipe kurung ganda atau adil
[[Prototype]]
. Banyak browser memberi kami tautan publik ke tautan yang memanggilnya__proto__
!Untuk lebih spesifik,
__proto__
sebenarnya adalah fungsi pengambil yang milik Objek JavaScript asli. Ia mengembalikan hubungan prototipe internal pribadi apa punthis
mengikat (pengembalian yang[[Prototype]]
darib
):Perlu dicatat bahwa mulai dari
ECMAScript5
, Anda juga dapat menggunakan metode getPrototypeOf untuk mendapatkan tautan pribadi internal:CATATAN: jawaban ini tidak bermaksud untuk menutupi seluruh proses membuat objek baru atau konstruktor baru, tetapi untuk lebih membantu memahami apa yang
__proto__
,prototype
dan[[Prototype]]
dan bagaimana cara kerjanya.sumber
Untuk membuatnya sedikit jelas selain jawaban-jawaban hebat di atas:
Contoh memiliki __proto__ , kelas memiliki prototipe .
sumber
Dalam JavaScript, fungsi dapat digunakan sebagai konstruktor. Itu berarti kita dapat membuat objek dari mereka menggunakan kata kunci baru. Setiap fungsi konstruktor dilengkapi dengan objek bawaan yang dirantai dengannya. Objek bawaan ini disebut prototipe.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Pertama kami membuat konstruktor:
function Foo(){}
. Agar jelas, Foo hanyalah fungsi lain. Tetapi kita dapat membuat objek darinya dengan kata kunci baru. Itu sebabnya kami menyebutnya fungsi konstruktorSetiap fungsi memiliki properti unik yang disebut properti prototipe. Jadi, fungsi Konstruktor
Foo
memiliki properti prototipe yang menunjuk ke prototipe, yaituFoo.prototype
(lihat gambar).Fungsi konstruktor sendiri adalah fungsi yang merupakan turunan dari konstruktor sistem yang disebut konstruktor [[Fungsi]]. Jadi kita dapat mengatakan bahwa
function Foo
itu dibangun oleh konstruktor [[Fungsi]]. Jadi, tentu__proto__
saja kamiFoo function
akan menunjukkan prototipe konstruktornya, yaituFunction.prototype
.Function.prototype
itu sendiri tidak lain adalah objek yang dibangun dari konstruktor sistem lain yang disebut[[Object]]
. Jadi,[[Object]]
adalah konstruktor dariFunction.prototype
. Jadi, bisa kita katakanFunction.prototype
adalah turunan dari[[Object]]
. Jadi__proto__
dariFunction.prototype
poin keObject.prototype
.Object.prototype
adalah orang terakhir yang berdiri di rantai prototipe. Maksud saya belum dibangun. Sudah ada di sistem. Jadi itu__proto__
menunjuk kenull
.Sekarang kita sampai pada contoh
Foo
. Ketika kita membuat instance menggunakannew Foo()
, itu menciptakan objek baru yang merupakan instance dariFoo
. Itu artinyaFoo
adalah konstruktor dari instance ini. Di sini kami membuat dua instance (x dan y).__proto__
dari x dan y dengan demikian menunjuk keFoo.prototype
.sumber
Ringkasan:
The
__proto__
properti dari objek adalah properti yang memetakan keprototype
fungsi constructor objek. Dengan kata lain:instance.__proto__ === constructor.prototype // true
Ini digunakan untuk membentuk
prototype
rantai suatu objek. Theprototype
chain adalah mekanisme lookup untuk properti pada objek. Jika properti objek diakses, JavaScript pertama-tama akan melihat objek itu sendiri. Jika properti itu tidak ditemukan di sana, itu akan naik hinggaprotochain
sampai ditemukan (atau tidak)Contoh:
Log pertama kita menghasilkan
true
, ini karena seperti yang disebutkan__proto__
properti instance yang dibuat oleh konstruktor merujuk keprototype
properti konstruktor. Ingat, dalam JavaScript, fungsi juga merupakan Objek. Objek dapat memiliki properti, dan properti default dari fungsi apa pun adalah salah satu properti bernama prototipe.Kemudian, ketika fungsi ini digunakan sebagai fungsi konstruktor, objek yang dipakai darinya akan menerima properti yang disebut
__proto__
. Dan__proto__
properti ini merujuk keprototype
properti fungsi konstruktor (yang secara default memiliki setiap fungsi).Mengapa ini berguna?
JavaScript memiliki mekanisme ketika mencari properti
Objects
yang disebut 'warisan prototypal' , di sini yang dasarnya:__proto__
properti. Di sana, ia memeriksa apakah properti tersedia pada objek yang dirujuk oleh__proto__
.__proto__
objek, ia akan memanjat__proto__
rantai, sampai keObject
objek.prototype
rantainya, ia akan kembaliundefined
.Sebagai contoh:
sumber
Saya kebetulan belajar prototipe dari You Don't Know JS: this & Object Prototypes , yang merupakan buku yang bagus untuk memahami desain di bawahnya dan mengklarifikasi begitu banyak kesalahpahaman (itulah sebabnya saya berusaha menghindari penggunaan pewarisan dan hal-hal seperti
instanceof
).Tetapi saya memiliki pertanyaan yang sama dengan yang ditanyakan orang-orang di sini. Beberapa jawaban sangat membantu dan mencerahkan. Saya juga ingin berbagi pemahaman saya.
Apa itu prototipe?
Objek dalam JavaScript memiliki properti internal, dilambangkan dalam spesifikasi sebagai
[[Prototype]]
, yang hanya merupakan referensi ke objek lain. Hampir semua benda diberinull
nilai untuk properti ini, pada saat penciptaannya.Bagaimana cara mendapatkan prototipe objek?
melalui
__proto__
atauObject.getPrototypeOf
Apa itu
prototype
?prototype
adalah objek yang secara otomatis dibuat sebagai properti khusus dari suatu fungsi , yang digunakan untuk menetapkan rantai delegasi (warisan), alias rantai prototipe.Ketika kita membuat fungsi
a
,prototype
secara otomatis dibuat sebagai properti khususa
dan menyimpan kode fungsi aktif sebagaiconstructor
aktifprototype
.Saya ingin mempertimbangkan properti ini sebagai tempat untuk menyimpan properti (termasuk metode) dari objek fungsi. Itu juga alasan mengapa fungsi utilitas di JS didefinisikan seperti
Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Mengapa harus menekankan sifat suatu fungsi ?
Jadi,
Arary
,Function
,Object
semua fungsi. Saya harus mengakui bahwa ini menyegarkan kesan saya di JS. Saya tahu fungsi adalah warga negara kelas satu di JS tetapi tampaknya dibangun berdasarkan fungsi.Apa perbedaan antara
__proto__
danprototype
?__proto__
referensi berfungsi pada setiap objek untuk merujuk ke[[Prototype]]
propertinya.prototype
adalah objek yang secara otomatis dibuat sebagai properti khusus dari suatu fungsi , yang digunakan untuk menyimpan properti (termasuk metode) dari objek fungsi.Dengan keduanya, kita bisa memetakan rantai prototipe secara mental. Seperti yang diilustrasikan gambar ini:
sumber
Dalam JavaScript, Setiap objek (fungsi juga objek!) Memiliki
__proto__
properti, properti tersebut merujuk pada prototipe-nya.Ketika kami menggunakan
new
operator dengan konstruktor untuk membuat objek baru,__proto__
properti objek baru akan ditetapkan dengan konstruktorprototype
properti , maka konstruktor akan dipanggil oleh objek baru, dalam proses itu "ini" akan menjadi referensi ke objek baru dalam lingkup konstruktor, akhirnya mengembalikan objek baru.Prototipe konstruktor adalah
__proto__
properti, properti konstruktorprototype
bekerja dengannew
operator.Konstruktor harus berupa fungsi, tetapi fungsi tidak selalu merupakan konstruktor walaupun memiliki
prototype
properti.Rantai prototipe sebenarnya adalah
__proto__
properti objek untuk referensi prototipe, dan__proto__
properti prototipe untuk referensi prototipe prototipe, dan seterusnya, sampai referensi__proto__
properti prototipe objek yang mengacu pada nol.Sebagai contoh:
[[Prototype]]
dan__proto__
properti sebenarnya adalah hal yang sama.Kita dapat menggunakan metode getPrototypeOf Object untuk mendapatkan prototipe sesuatu.
Fungsi apa pun yang kami tulis dapat digunakan untuk membuat objek dengan
new
operator, sehingga siapa pun dari fungsi tersebut dapat menjadi konstruktor.sumber
Cara lain yang baik untuk memahaminya:
Hanya setelah IE11
__proto__
didukung. Sebelum versi itu, seperti IE9, Anda bisa menggunakanconstructor
untuk mendapatkan__proto__
.sumber
prototipe
prototipe adalah properti dari suatu Fungsi. Ini adalah cetak biru untuk membuat objek dengan menggunakan fungsi (konstruktor) dengan kata kunci baru.
__proto__
digunakan dalam rantai pencarian untuk menyelesaikan metode, properti. ketika sebuah objek dibuat (menggunakan fungsi konstruktor dengan kata kunci baru),__proto__
diatur ke (Konstruktor) Function.prototypeInilah penjelasan (khayalan) saya untuk menghapus kebingungan:
Bayangkan ada kelas imajiner (cetak biru / pemotong coockie) yang terkait dengan fungsi. Kelas imajiner itu digunakan untuk instantiate objek.
prototype
adalah mekanisme ekstensi (metode ekstensi dalam C #, atau Swift Extension) untuk menambahkan sesuatu ke kelas imajiner itu.Di atas dapat dibayangkan sebagai:
Begitu,
Sekarang menambahkan metode ke
prototype
Robot:Di atas dapat dibayangkan sebagai ekstensi dari kelas Robot:
Yang pada gilirannya,
sumber
__proto__
dan prototipe yang lebih masuk akal . mungkin prototipe dan warisan?prototype
&__proto__
keduanya harus dihindari. Kami memiliki kelas sekarang dan saya suka OOP.Untuk membuatnya lebih sederhana:
Ini memungkinkan Anda untuk melampirkan properti ke X.prototype SETELAH objek tipe X telah dipakai, dan mereka masih akan mendapatkan akses ke properti baru melalui referensi __proto__ yang digunakan mesin Javascript untuk berjalan di rantai prototipe.
sumber
Prototipe atau Object.prototype adalah properti dari objek literal. Ini mewakili objek prototipe objek yang dapat Anda timpa untuk menambahkan lebih banyak properti atau metode lebih lanjut di sepanjang rantai prototipe.
__proto__ adalah properti accessor (fungsi get and set) yang mengekspos prototipe internal objek melalui mana ia diakses.
Referensi:
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
sumber
Object.prototype
bukan properti dari objek literal, berusaha mencetak{}.prototype
pengembalian yang tidak ditentukan; Namun, itu dapat diakses melalui{}.__proto__
, yang mengembalikanObject.prototype
.Saya tahu, saya terlambat tetapi biarkan saya mencoba menyederhanakannya.
Katakanlah ada fungsi
Fungsi Foo akan memiliki objek prototipe yang ditautkan. Jadi, Setiap kali kita membuat fungsi dalam JavaScript, ia selalu memiliki objek prototipe yang terhubung dengannya.
Sekarang mari kita pergi ke depan dan membuat dua objek menggunakan fungsi Foo.
Sekarang, Foo.prototype, a. proto , dan b. proto all menunjukkan objek yang sama.
semua di atas akan mengembalikan true.
Seperti yang kita ketahui, dalam JavaScript properti dapat ditambahkan secara dinamis. Kita dapat menambahkan properti ke objek
Seperti yang Anda lihat kami menambahkan metode Greet () di Foo.prototype tetapi dapat diakses di a dan b atau objek lain yang dibangun menggunakan Foo.
Saat menjalankan a.Greet (), JavaScript pertama-tama akan mencari Greet in object a pada daftar properti. Jika tidak menemukan, itu akan naik dalam rantai proto a. Sejak. proto dan Foo.prototype adalah objek yang sama, JavaScript akan menemukan metode Greet () dan menjalankannya.
Saya harap, sekarang prototipe dan proto disederhanakan sedikit.
sumber
Contoh penjelasan:
sekarang, myPupppie memiliki
__proto__
properti yang mengarah ke Dog.prototype.tetapi myPuppie TIDAK memiliki properti prototipe.
Jadi,
__proto__
dari mypuppie adalah referensi ke properti .prototype dari fungsi konstruktor yang digunakan untuk instantiate objek ini (dan objek myPuppie saat ini memiliki hubungan "delegasi ke" dengan ini__proto__
objek ), sedangkan properti .protype dari myPuppie tidak ada (karena kami tidak mengaturnya).Penjelasan yang baik oleh MPJ di sini: proto vs prototipe - Pembuatan Objek dalam JavaScript
sumber
Saya telah membuat sendiri gambar kecil yang mewakili cuplikan kode berikut:
Saya memiliki latar belakang OO klasik, jadi sangat membantu untuk mewakili hierarki dengan cara ini. Untuk membantu Anda membaca diagram ini, perlakukan persegi panjang pada gambar sebagai objek JavaScript. Dan ya, fungsi juga objek. ;)
Objek dalam JavaScript memiliki properti dan
__proto__
hanya salah satunya.Gagasan di balik properti ini adalah untuk menunjuk ke objek leluhur dalam hierarki (warisan).
Objek root dalam JavaScript adalah
Object.prototype
dan semua objek lainnya adalah turunan dari objek ini. The__proto__
properti dari objek akarnull
, yang merupakan akhir rantai warisan.Anda akan melihat bahwa itu
prototype
adalah properti fungsi.Cat
adalah fungsi, tetapi jugaFunction
danObject
merupakan fungsi (asli).tom
bukan fungsi, jadi tidak memiliki properti ini.Gagasan di balik properti ini adalah untuk menunjuk ke objek yang akan digunakan dalam konstruksi, yaitu ketika Anda memanggil
new
operator pada fungsi itu.Memang, ketika kita membuat
tom
objek dengannew Cat()
, objek yang dibuat akan memiliki__proto__
properti yang disetel keprototype
objek fungsi konstruktor.Pada akhirnya, mari kita bermain dengan diagram ini sedikit. Pernyataan berikut ini benar:
tom.__proto__
properti menunjuk ke objek yang sama denganCat.prototype
.Cat.__proto__
menunjuk keFunction.prototype
objek, seperti sukaFunction.__proto__
danObject.__proto__
lakukan.Cat.prototype.__proto__
dantom.__proto__.__proto__
arahkan ke objek yang sama dan ituObject.prototype
.Bersulang!
sumber
tom.__proto__
danCat.prototype
sangat sama, Jadi,tom.__proto__ === Cat.prototype
DanCat.prototype === tom.__proto__
itu benar Jadi, apa yang Anda maksud dengan panah pada gambar ??prototype
juga propertiCat
objek (dari pertanyaan Anda).DEFINISI
(angka di dalam tanda kurung () adalah 'tautan' ke kode yang ditulis di bawah ini)
prototype
- objek yang terdiri dari:=> fungsi (3) khusus ini
ConstructorFunction.prototype
(5) yang dapat diakses oleh masing-masing objek (4) dibuat atau akan dibuat melalui fungsi konstruktor ini (1)=> fungsi konstruktor itu sendiri (1) )
=>
__proto__
objek khusus ini (objek prototipe)__proto__
(dandor proto?) - tautan ANTARA objek apa pun (2) dibuat melalui fungsi konstruktor tertentu (1), DAN properti objek prototipe (5) dari konstruktor itu YANG memungkinkan setiap objek yang dibuat (2) memiliki akses ke fungsi prototipe dan metode (4) (__proto__
secara default termasuk dalam setiap objek tunggal di JS)KLARIFIKASI KODE
1.
2.
3.
4.
5.
sumber
Saya akan mencoba penjelasan kelas 4:
Segalanya sangat sederhana. A
prototype
adalah contoh bagaimana sesuatu harus dibangun. Begitu:Saya
function
dan saya membangun objek baru yang mirip dengan sayaprototype
Saya seorang
object
dan saya dibangun menggunakan__proto__
contoh sayabukti :
sumber
prototype
juga__proto__
tidak digunakan kapan saja sebagai cetak biru atau lebih untuk membuat objek apa pun. Ini adalah mitos yang diperkenalkan olehclass
sintaks yang kabur dan pendahulunya. Sebagai jawaban-posting mengatakan itu hanya digunakan untuk rantai pencarian dan dalam kasusprototype
untuk mengidentifikasiconstructor
digunakan dengannew
(yang merupakan bagian dari mekanisme pura-pura menjadi berkelas yang membingungkan banyak pengguna termasuk saya).Setiap fungsi yang Anda buat memiliki properti yang disebut
prototype
, dan ia memulai kehidupannya sebagai objek kosong. Properti ini tidak digunakan sampai Anda menggunakan fungsi ini sebagai fungsi konstruktor yaitu dengan kata kunci 'baru'.Ini sering dikacaukan dengan
__proto__
properti dari suatu objek. Beberapa orang mungkin menjadi bingung dan kecuali bahwaprototype
properti dari suatu objek mungkin menjadikan mereka proto dari suatu objek. Tapi ini tidak terjadi.prototype
digunakan untuk mendapatkan__proto__
objek yang dibuat dari function constructor.Dalam contoh di atas:
Saya harap ini masuk akal.
sumber
prototype
tidak digunakan untuk membuat__proto__
objek.__proto__
, ketika diakses, hanya menyediakan referensi keprototype
objek.Bagaimana dengan menggunakan
__proto__
metode statis?sumber
__proto__
VS.prototype
dalam JavaScript" ?Coba kode ini untuk mengerti
sumber
Hanya ada satu objek yang digunakan untuk rantai protypal. Objek ini jelas memiliki nama dan nilai:
__proto__
adalah namanya, danprototype
adalah nilainya. Itu saja.untuk membuatnya lebih mudah dipahami, lihat diagram di bagian atas posting ini (Diagram oleh dmitry soshnikov), Anda tidak akan pernah menemukan
__proto__
poin ke hal lain selainprototype
sebagai nilainya.Intinya adalah ini:
__proto__
adalah nama yang mereferensikan objek prototypal, danprototype
merupakan objek prototypal yang sebenarnya.Ini seperti mengatakan:
x
adalah nama objek (penunjuk), dan{name: 'john'}
merupakan objek aktual (nilai data).CATATAN: ini hanya petunjuk sederhana yang disederhanakan tentang bagaimana mereka terkait pada tingkat tinggi.
Pembaruan: Ini adalah contoh javascript konkret sederhana untuk ilustrasi yang lebih baik:
Ini berarti bahwa ketika
Object.getPrototypeOf(x)
membuat kita nilai sebenarnya darix
(yang merupakan prototipe), adalah apa yang__proto__
darix
menunjuk ke. Oleh karena__proto__
itu memang menunjuk ke prototipex
. Demikian__proto__
referensix
(penunjukx
), danprototype
merupakan nilaix
(prototipe-nya).Saya harap ini agak jelas sekarang.
sumber
Ini adalah pertanyaan yang sangat penting yang relevan bagi siapa saja yang ingin memahami warisan prototipikal. Dari apa yang saya mengerti, prototipe ditugaskan secara default ketika suatu objek dibuat dengan yang baru dari suatu fungsi karena Fungsi memiliki objek prototipe menurut definisi:
Ketika kita membuat objek biasa tanpa yang baru, yaitu secara eksplisit dari suatu fungsi, ia tidak memiliki prototipe tetapi memiliki proto kosong yang dapat diberikan prototipe.
Kita dapat menggunakan Object.create untuk menautkan objek secara eksplisit.
sumber
__proto__
adalah basis untuk membangunprototype
dan fungsi konstruktor misalnya:function human(){}
memilikiprototype
yang dibagikan melalui__proto__
dalam instance baru dari fungsi konstruktor. Bacalah lebih rinci di sinisumber
Seperti ini dinyatakan dengan benar
Kita selanjutnya dapat mencatat bahwa
__proto__
properti dari objek yang dibuat menggunakan titik-titik fungsi konstruktor ke lokasi memori yang ditunjukkan oleh prototipe properti konstruktor masing-masing.Jika kita mengubah lokasi memori prototipe fungsi konstruktor,
__proto__
objek yang diturunkan masih akan terus mengarah ke ruang alamat asli. Oleh karena itu untuk membuat properti umum tersedia di rantai pewarisan, selalu tambahkan properti ke prototipe fungsi konstruktor , alih-alih menginisialisasi ulang (yang akan mengubah alamat memorinya).Perhatikan contoh berikut:
sumber
Pemahaman saya adalah: __proto__ dan prototipe semuanya disajikan untuk teknik rantai prototipe. perbedaannya adalah fungsi yang diberi nama underscore (seperti __proto__) tidak bertujuan untuk pengembang yang dipanggil secara eksplisit sama sekali. dengan kata lain, mereka hanya untuk beberapa mekanisme seperti pewarisan dll. mereka adalah 'back-end'. tetapi fungsi-fungsi yang dinamai tanpa garis bawah dirancang untuk dipanggil secara eksplisit, mereka 'front-end'.
sumber
__proto__
danprototype
, dari sekadar konvensi penamaan. Mereka mungkin atau mungkin tidak menunjuk ke objek yang sama. Lihat jawaban @zyklus.!!! INI ADALAH PENJELASAN TERBAIK DI DUNIA !!!!!
dalam fungsi konstruktor panggilan mesin javascript ini
q.__proto__ = prototype
secara otomatis ketika kita menulisnew Class
, dan masuk ke__proto__
set propClass.prototype
Nikmati %)
sumber