Saya tidak terlalu suka bahasa pemrograman yang dinamis tapi saya sudah menulis kode JavaScript yang adil. Saya tidak pernah benar-benar memusatkan perhatian pada pemrograman berbasis prototipe ini, apakah ada yang tahu cara kerjanya?
var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Saya ingat banyak diskusi yang saya lakukan dengan orang-orang beberapa waktu lalu (saya tidak begitu yakin apa yang saya lakukan) tetapi ketika saya memahaminya, tidak ada konsep kelas. Itu hanya sebuah objek, dan contoh dari objek tersebut adalah klon dari yang asli, bukan?
Tapi apa tujuan sebenarnya dari properti ".prototype" ini di JavaScript? Bagaimana hubungannya dengan objek instantiating?
Perbarui: cara yang benar
var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!
function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
Slide ini juga sangat membantu.
javascript
dynamic-languages
prototype-oriented
John Leidegren
sumber
sumber
Jawaban:
Setiap objek JavaScript memiliki "slot" internal
[[Prototype]]
yang disebut yang nilainya baiknull
atauobject
. Anda dapat menganggap slot sebagai properti pada objek, internal mesin JavaScript, disembunyikan dari kode yang Anda tulis. Tanda kurung di sekitar[[Prototype]]
disengaja, dan merupakan konvensi spesifikasi Script ECMAS untuk menunjukkan slot internal.Nilai yang ditunjukkan oleh
[[Prototype]]
objek, secara bahasa dikenal sebagai "prototipe objek itu."Jika Anda mengakses properti melalui notasi titik (
obj.propName
) atau braket (obj['propName']
), dan objek tidak secara langsung memiliki properti seperti itu (mis. Properti sendiri , dapat diperiksa melaluiobj.hasOwnProperty('propName')
), runtime mencari properti dengan nama pada objek yang direferensikan oleh[[Prototype]]
sebaliknya. Jika[[Prototype]]
juga tidak memiliki properti seperti itu, maka[[Prototype]]
diperiksa pada gilirannya, dan seterusnya. Dengan cara ini, rantai prototipe objek asli berjalan sampai kecocokan ditemukan, atau akhirnya tercapai. Di bagian atas rantai prototipe adalahnull
nilainya.Implementasi JavaScript modern memungkinkan akses baca dan / atau tulis ke
[[Prototype]]
dalam cara-cara berikut:new
operator (mengkonfigurasi rantai prototipe pada objek bawaan kembali dari fungsi konstruktor),extends
kunci (mengkonfigurasi rantai prototipe saat menggunakan sintaks kelas),Object.create
akan menetapkan argumen yang disediakan sebagai[[Prototype]]
objek yang dihasilkan,Object.getPrototypeOf
danObject.setPrototypeOf
(dapatkan / atur pembuatan objek[[Prototype]]
setelah ), dan__proto__
(mirip dengan 4.)Object.getPrototypeOf
danObject.setPrototypeOf
lebih disukai__proto__
, sebagian karena perilakuo.__proto__
yang tidak biasa ketika sebuah objek memiliki prototipenull
.Suatu objek pada
[[Prototype]]
awalnya diatur selama pembuatan objek.Jika Anda membuat objek baru melalui
new Func()
, objek[[Prototype]]
akan, secara default, diatur ke objek yang dirujuk olehFunc.prototype
.Perhatikan bahwa, oleh karena itu, semua kelas, dan semua fungsi yang dapat digunakan dengan
new
operator, memiliki properti yang dinamai.prototype
di samping[[Prototype]]
slot internal mereka sendiri . Penggunaan ganda kata "prototipe" ini adalah sumber kebingungan yang tak berkesudahan di antara para pendatang baru dalam bahasa tersebut.Menggunakan
new
dengan fungsi konstruktor memungkinkan kita untuk mensimulasikan pewarisan klasik dalam JavaScript; meskipun sistem pewarisan JavaScript adalah - seperti yang telah kita lihat - prototipe, dan bukan berbasis kelas.Sebelum pengenalan sintaks kelas ke JavaScript, fungsi konstruktor adalah satu-satunya cara untuk mensimulasikan kelas. Kita dapat memikirkan properti objek yang dirujuk oleh
.prototype
properti fungsi konstruktor sebagai anggota bersama; yaitu. anggota yang sama untuk setiap instance. Dalam sistem berbasis kelas, metode diimplementasikan dengan cara yang sama untuk setiap instance, sehingga metode secara konseptual ditambahkan ke.prototype
properti; bidang objek, bagaimanapun, adalah khusus-contoh dan karena itu ditambahkan ke objek itu sendiri selama konstruksi.Tanpa sintaksis kelas, pengembang harus secara manual mengkonfigurasi rantai prototipe untuk mencapai fungsi yang mirip dengan warisan klasik. Ini mengarah pada banyak cara berbeda untuk mencapai ini.
Ini salah satu caranya:
... dan inilah cara lain:
Sintaks kelas yang diperkenalkan dalam ES2015 menyederhanakan banyak hal, dengan menyediakan
extends
sebagai "satu cara yang benar" untuk mengkonfigurasi rantai prototipe untuk mensimulasikan pewarisan klasik dalam JavaScript.Jadi, mirip dengan kode di atas, jika Anda menggunakan sintaks kelas untuk membuat objek baru seperti:
... objek yang dihasilkan
[[Prototype]]
akan diatur ke instanceParent
, yang[[Prototype]]
, pada gilirannya, adalahParent.prototype
.Akhirnya, jika Anda membuat objek baru melalui
Object.create(foo)
, objek yang dihasilkan[[Prototype]]
akan diatur kefoo
.sumber
Dalam bahasa yang mengimplementasikan warisan klasik seperti Java, C # atau C ++ Anda mulai dengan membuat kelas - cetak biru untuk objek Anda - dan kemudian Anda bisa membuat objek baru dari kelas itu atau Anda bisa memperluas kelas, mendefinisikan kelas baru yang menambah kelas aslinya.
Di JavaScript Anda pertama kali membuat objek (tidak ada konsep kelas), maka Anda dapat menambah objek Anda sendiri atau membuat objek baru dari sana. Ini tidak sulit, tetapi sedikit asing dan sulit dimetabolisme untuk seseorang yang terbiasa dengan cara klasik.
Contoh:
Sampai sekarang saya telah memperluas objek dasar, sekarang saya membuat objek lain dan kemudian mewarisi dari Person.
Tampilkan cuplikan kode
Sementara seperti yang saya katakan, saya tidak bisa memanggil setAmountDue (), getAmountDue () pada Seseorang.
sumber
Customer.prototype = new Person();
garis, MDN menunjukkan contoh menggunakanCustomer.prototype = Object.create(Person.prototype)
, dan menyatakan bahwa 'Kesalahan umum di sini adalah menggunakan "Orang baru ()"' . sumberIni adalah model objek berbasis prototipe yang sangat sederhana yang akan dianggap sebagai sampel selama penjelasan, tanpa komentar:
Ada beberapa poin penting yang harus kita pertimbangkan sebelum melalui konsep prototipe.
1- Cara kerja sebenarnya fungsi JavaScript:
Untuk mengambil langkah pertama kita harus mencari tahu, bagaimana fungsi JavaScript benar-benar bekerja, sebagai fungsi seperti kelas menggunakan
this
kata kunci di dalamnya atau hanya sebagai fungsi biasa dengan argumennya, apa yang dilakukannya dan apa yang dikembalikan.Katakanlah kita ingin membuat
Person
model objek. tetapi dalam langkah ini saya akan mencoba melakukan hal yang persis sama tanpa menggunakanprototype
dannew
kata kunci .Jadi pada langkah ini
functions
,objects
danthis
kata kunci, adalah semua yang kita miliki.Pertanyaan pertama adalah bagaimana
this
kata kunci dapat berguna tanpa menggunakannew
kata kunci .Jadi untuk menjawabnya katakanlah kita memiliki objek kosong, dan dua fungsi seperti:
dan sekarang tanpa menggunakan
new
kata kunci bagaimana kita bisa menggunakan fungsi-fungsi ini. Jadi JavaScript memiliki 3 cara berbeda untuk melakukannya:Sebuah. Cara pertama adalah memanggil fungsi sebagai fungsi biasa:
dalam hal ini, ini akan menjadi objek konteks saat ini, yang biasanya merupakan
window
objek global di browser atauGLOBAL
diNode.js
. Itu berarti kita akan memiliki, window.name di browser atau GLOBAL.name di Node.js, dengan "George" sebagai nilainya.b. Kita bisa melampirkannya ke objek, sebagai propertinya
- Cara termudah untuk melakukan ini adalah memodifikasi
person
objek kosong , seperti:dengan cara ini kita dapat memanggil mereka seperti:
dan sekarang
person
objeknya seperti:- Cara lain untuk melampirkan properti ke objek adalah menggunakan
prototype
objek yang dapat ditemukan di objek JavaScript apa pun dengan nama__proto__
, dan saya telah mencoba menjelaskannya sedikit pada bagian ringkasan. Jadi kita bisa mendapatkan hasil yang serupa dengan melakukan:Tapi dengan cara ini apa yang sebenarnya kita lakukan adalah memodifikasi
Object.prototype
, karena setiap kali kita membuat objek JavaScript menggunakan literal ({ ... }
), itu akan dibuat berdasarkanObject.prototype
, yang berarti akan dilampirkan ke objek yang baru dibuat sebagai atribut yang dinamai__proto__
, jadi jika kita mengubahnya , seperti yang telah kami lakukan pada cuplikan kode kami sebelumnya, semua objek JavaScript akan berubah, bukan praktik yang baik. Jadi apa yang bisa menjadi praktik yang lebih baik sekarang:dan sekarang benda-benda lain dalam kedamaian, tetapi itu masih tampak bukan praktik yang baik. Jadi kita masih memiliki satu solusi lagi, tetapi untuk menggunakan solusi ini kita harus kembali ke baris kode tempat
person
objek dibuat (var person = {};
) lalu ubah seperti:apa yang dilakukannya adalah menciptakan JavaScript baru
Object
dan melampirkanpropertiesObject
ke__proto__
atribut. Jadi untuk memastikan Anda bisa melakukan:Tetapi poin yang sulit di sini adalah Anda memiliki akses ke semua properti yang ditentukan
__proto__
pada tingkat pertamaperson
objek (baca bagian ringkasan untuk lebih detail).seperti yang Anda lihat menggunakan salah satu dari dua cara
this
ini persis akan menunjuk keperson
objek.c. JavaScript memiliki cara lain untuk menyediakan fungsi
this
, yaitu menggunakan panggilan atau menerapkan untuk memanggil fungsi.dan
Dengan cara ini yang merupakan favorit saya, kami dapat dengan mudah memanggil fungsi kami seperti:
atau
3 metode ini adalah langkah awal yang penting untuk mengetahui fungsionalitas .prototype.
2- Bagaimana cara kerja
new
kata kunci?ini adalah langkah kedua untuk memahami
.prototype
fungsi ini. Inilah yang saya gunakan untuk mensimulasikan proses:di bagian ini saya akan mencoba mengambil semua langkah yang diambil JavaScript, tanpa menggunakan
new
kata kunci danprototype
, ketika Anda menggunakannew
kata kunci. jadi ketika kita melakukannyanew Person("George")
,Person
fungsi berfungsi sebagai konstruktor, Inilah yang dilakukan JavaScript, satu per satu:Sebuah. pertama-tama ia membuat objek kosong, pada dasarnya hash kosong seperti:
b. langkah selanjutnya yang diambil JavaScript adalah melampirkan semua objek prototipe ke objek yang baru dibuat
kami miliki di
my_person_prototype
sini mirip dengan objek prototipe.Ini bukan cara JavaScript benar-benar melampirkan properti yang didefinisikan dalam prototipe. Cara aktual terkait dengan konsep rantai prototipe.
Sebuah. & b. Alih-alih dua langkah ini Anda dapat memiliki hasil yang sama persis dengan melakukan:
sekarang kita dapat memanggil
getName
fungsi dimy_person_prototype
:c. maka itu memberikan objek itu ke konstruktor,
kita bisa melakukan ini dengan sampel kami seperti:
atau
maka constructor dapat melakukan apapun yang diinginkan, karena ini dalam konstruktor yang merupakan objek yang baru saja dibuat.
sekarang hasil akhirnya sebelum mensimulasikan langkah-langkah lain: Object {name: "George"}
Ringkasan:
Pada dasarnya, ketika Anda menggunakan kata kunci baru pada suatu fungsi, Anda memanggilnya dan fungsi itu berfungsi sebagai konstruktor, jadi ketika Anda mengatakan:
JavaScript internal membuat sebuah objek, sebuah hash kosong dan kemudian memberikan yang objek untuk konstruktor, maka konstruktor dapat melakukan apapun yang diinginkan, karena ini dalam konstruktor yang merupakan objek yang baru saja dibuat dan kemudian memberikan Anda bahwa objek tentu saja jika Anda belum menggunakan pernyataan pengembalian di fungsi Anda atau jika Anda telah meletakkan
return undefined;
di akhir fungsi Anda.Jadi ketika JavaScript pergi untuk mencari properti pada suatu objek, hal pertama yang dilakukannya, adalah mencarinya di objek itu. Dan kemudian ada properti rahasia
[[prototype]]
yang biasanya kita suka__proto__
dan properti itu adalah apa yang terlihat JavaScript selanjutnya. Dan ketika ia melihat melalui__proto__
, sejauh itu lagi objek JavaScript lain, ia memiliki__proto__
atribut sendiri , itu naik dan naik sampai ke titik di mana berikutnya__proto__
adalah nol. Intinya adalah satu-satunya objek dalam JavaScript yang__proto__
atributnya null adalahObject.prototype
objek:dan itulah cara kerja warisan dalam JavaScript.
Dengan kata lain, ketika Anda memiliki properti prototipe pada suatu fungsi dan Anda memanggil yang baru pada itu, setelah JavaScript selesai melihat objek yang baru dibuat untuk properti, itu akan melihat fungsi
.prototype
dan juga mungkin bahwa objek ini memiliki prototipe internal sendiri. dan seterusnya.sumber
__proto__
Anda pertama-tama akan menghapus semua properti prototipe tingkat atas dan kemudian Anda memiliki basis proto baru yang tidak dibagikan lagi kecuali Anda membaginya.Tujuh Koans prototipe
Ketika Ciro San turun ke Gunung Rubah Api setelah meditasi mendalam, pikirannya jernih dan damai.
Namun tangannya, gelisah, dan dengan sendirinya meraih sikat dan mencatat catatan berikut.
0) Dua hal berbeda dapat disebut "prototipe":
properti prototipe, seperti pada
obj.prototype
properti internal prototipe, dilambangkan seperti
[[Prototype]]
dalam ES5 .Itu dapat diambil melalui ES5
Object.getPrototypeOf()
.Firefox membuatnya dapat diakses melalui
__proto__
properti sebagai ekstensi. ES6 sekarang menyebutkan beberapa persyaratan opsional untuk__proto__
.1) Konsep-konsep itu ada untuk menjawab pertanyaan:
Secara intuitif, warisan klasik harus memengaruhi pencarian properti.
2)
__proto__
digunakan untuk.
pencarian properti dot seperti padaobj.property
..prototype
yang tidak digunakan untuk pencarian langsung, hanya secara tidak langsung karena menentukan__proto__
di pembuatan obyek dengannew
.Urutan pencarian adalah:
obj
properti ditambahkan denganobj.p = ...
atauObject.defineProperty(obj, ...)
obj.__proto__
obj.__proto__.__proto__
, dan sebagainya__proto__
adalahnull
, kembaliundefined
.Inilah yang disebut rantai prototipe .
Anda dapat menghindari
.
pencarian denganobj.hasOwnProperty('key')
danObject.getOwnPropertyNames(f)
3) Ada dua cara utama untuk mengatur
obj.__proto__
:new
:kemudian
new
telah menetapkan:Ini adalah di mana
.prototype
akan digunakan.Object.create
:set:
4) Kode:
Sesuai dengan diagram berikut (beberapa
Number
hal dihilangkan):Diagram ini menunjukkan banyak node objek bahasa yang ditentukan sebelumnya:
null
Object
Object.prototype
Function
Function.prototype
1
Number.prototype
(dapat ditemukan dengan(1).__proto__
, kurung wajib untuk memenuhi sintaksis)2 baris kode kami hanya membuat objek baru berikut:
f
F
F.prototype
i
sekarang menjadi milikf
karena ketika Anda melakukannya:itu mengevaluasi
F
denganthis
menjadi nilai yangnew
akan kembali, yang kemudian ditugaskanf
.5)
.constructor
biasanya berasal dariF.prototype
melalui.
pencarian:Saat kami menulis
f.constructor
, JavaScript melakukan.
pencarian sebagai:f
tidak memiliki.constructor
f.__proto__ === F.prototype
telah.constructor === F
, jadi ambillahHasilnya
f.constructor == F
secara intuitif benar, karenaF
digunakan untuk membangunf
, misalnya mengatur bidang, seperti dalam bahasa OOP klasik.6) Sintaks warisan klasik dapat dicapai dengan memanipulasi rantai prototipe.
ES6 menambahkan
class
danextends
kata kunci, yang sebagian besar sintaksis gula untuk kegilaan manipulasi prototipe yang sebelumnya mungkin.Diagram sederhana tanpa semua objek yang telah ditentukan:
Mari luangkan waktu sejenak untuk mempelajari cara kerja berikut ini:
Garis set pertama
c.i
untuk1
seperti yang dijelaskan dalam "4)".Di baris kedua, ketika kita melakukannya:
.inc
ditemukan melalui[[Prototype]]
rantai:c
->C
->C.prototype
->inc
X.Y()
, JavaScript secara otomatis disetelthis
keX
dalamY()
fungsi panggilan!Logika yang sama persis juga menjelaskan
d.inc
dand.inc2
.Artikel ini https://javascript.info/class#not-just-a-syntax-sugar menyebutkan efek lebih lanjut yang
class
perlu diketahui. Beberapa dari mereka mungkin tidak dapat dicapai tanpaclass
kata kunci (TODO periksa yang mana):[[FunctionKind]]:"classConstructor"
, yang memaksa konstruktor dipanggil dengan yang baru: Apa alasan konstruktor kelas ES6 tidak dapat disebut sebagai fungsi normal?Object.defineProperty
.use strict
. Dapat dilakukan dengan eksplisituse strict
untuk setiap fungsi, yang diakui membosankan.sumber
.
pencarian (dan berapa banyak salinan data dibuat) . Jadi saya berusaha memahami hal itu. Sisanya adalah Google + posting blog + juru bahasa Js di tangan. :)sets f.constructor = F
itu jelas-jelas salah dan bertentangan dengan bagian selanjutnya:.constructor
ditemukan melalui.
pencarian pada rantai prototipe. Perbaiki sekarang.f
prototipe ditetapkanF
hanya pada waktu konstruksi;f
tidak akan tahu atau peduliF.prototype
kapan saja setelah pertama kali dibangun.prototype
memungkinkan Anda membuat kelas. jika Anda tidak menggunakannyaprototype
maka itu menjadi statis.Ini adalah contoh singkat.
Dalam kasus di atas, Anda memiliki tes panggilan fungsi statis. Fungsi ini hanya dapat diakses oleh obj.test di mana Anda dapat membayangkan obj menjadi sebuah kelas.
dimana seperti pada kode di bawah ini
Keberatan telah menjadi kelas yang sekarang bisa dipakai. Beberapa contoh objek bisa ada dan semuanya memiliki
test
fungsi.Di atas adalah pemahaman saya. Saya menjadikannya sebagai wiki komunitas, sehingga orang dapat memperbaiki saya jika saya salah.
sumber
prototype
adalah properti fungsi konstruktor, bukan instance, mis. Kode Anda salah! Mungkin Anda berarti properti non-standar__proto__
objek, tapi itu binatang yang berbeda seluruh ...Setelah membaca utas ini, saya merasa bingung dengan Rantai Prototipe JavaScript, kemudian saya menemukan grafik ini
http://iwiki.readthedocs.org/en/latest/javascript/js_core.html#inheritance
ini bagan yang jelas untuk menunjukkan JavaScript Inheritance oleh Prototype Chain
dan
http://www.javascriptbank.com/javascript/article/JavaScript_Classical_Inheritance/
yang ini berisi contoh dengan kode dan beberapa diagram yang bagus.
Semoga bermanfaat bagi Anda untuk memahami Rantai Prototipe JavaScript.
sumber
[[Prototype]]
artinya?Setiap objek memiliki properti internal, [[Prototipe]] , yang menautkannya ke objek lain:
Dalam javascript tradisional, objek yang ditautkan adalah
prototype
properti dari suatu fungsi:Beberapa lingkungan mengekspos [[Prototipe]] sebagai
__proto__
:Anda membuat tautan [[Prototipe]] saat membuat objek.
Jadi pernyataan ini setara:
Anda sebenarnya tidak dapat melihat target tautan (
Object.prototype
) dalam pernyataan baru ; sebaliknya target tersirat oleh konstruktor (Object
).Ingat:
prototype
properti, awalnya memegang objek kosong.prototype
properti konstruktor mereka.prototype
propertinya akan tidak digunakan.new
.sumber
Object.create()
dokumen , @sam. Tautan ke__proto__
danObject.prototype
akan menjadi perangkat tambahan yang bagus. Dan saya menyukai contoh Anda tentang bagaimana prototipe bekerja dengan konstruktor danObject.create()
, tetapi mereka mungkin bagian yang lama dan kurang relevan yang ingin Anda singkirkan.Javascript tidak memiliki warisan dalam arti biasa, tetapi memiliki rantai prototipe.
rantai prototipe
Jika anggota suatu objek tidak dapat ditemukan dalam objek itu akan dicari dalam rantai prototipe. Rantai terdiri dari benda-benda lain. Prototipe dari contoh yang diberikan dapat diakses dengan
__proto__
variabel. Setiap objek memiliki satu, karena tidak ada perbedaan antara kelas dan instance dalam javascript.Keuntungan menambahkan fungsi / variabel ke prototipe adalah bahwa ia harus berada di memori hanya sekali, bukan untuk setiap instance.
Ini juga berguna untuk warisan, karena rantai prototipe dapat terdiri dari banyak objek lain.
sumber
Artikel ini panjang. Tapi saya yakin itu akan menghapus sebagian besar pertanyaan Anda tentang sifat "prototipikal" dari JavaScript Inheritance. Dan bahkan lebih. Silakan baca artikel selengkapnya.
JavaScript pada dasarnya memiliki dua jenis tipe data
Bukan benda
Berikut ini adalah tipe data non objek
Tipe data ini kembali mengikuti ketika Anda menggunakan operator typeof
typeof "string literal" (atau variabel yang berisi string literal) === 'string'
typeof 5 (atau numeric literal atau variabel yang mengandung numeric literal atau NaN atau Infinity ) === 'number'
typeof true (atau false atau variabel yang mengandung true atau false ) === 'boolean'
typeof undefined (atau variabel yang tidak terdefinisi atau variabel yang mengandung tidak terdefinisi ) === 'tidak terdefinisi'
Tipe data string , angka , dan boolean dapat direpresentasikan sebagai Objek dan Non objek . Saat direpresentasikan sebagai objek, tipenya selalu === 'objek'. Kami akan kembali ke ini setelah kami memahami tipe data objek.
Benda
Tipe data objek selanjutnya dapat dibagi menjadi dua jenis
The Fungsi jenis benda adalah orang-orang yang kembali string 'fungsi' dengan typeof operator. Semua fungsi yang ditentukan pengguna dan semua objek bawaan JavaScript yang dapat membuat objek baru dengan menggunakan operator baru termasuk dalam kategori ini. Untuk misalnya.
Jadi, typeof (Object) === typeof (String) === typeof (Number) === typeof (Boolean) === typeof (Array) === typeof (RegExp) === typeof (Fungsi) == = typeof (UserDefinedFunction) === 'function'
Semua Fungsi jenis benda sebenarnya contoh yang dibangun di JavaScript objek Fungsi (termasuk Fungsi objek yaitu itu rekursif didefinisikan). Seolah-olah benda-benda ini telah didefinisikan dengan cara berikut
Seperti yang disebutkan, objek tipe Fungsi selanjutnya dapat membuat objek baru menggunakan operator baru . Untuk misalnya objek bertipe Objek , String , Nomor , Boolean , Array , RegExp Atau UserDefinedFunction dapat dibuat dengan menggunakan
Objek yang dibuat adalah semua objek tipe Non Function dan mengembalikan tipenya === 'objek' . Dalam semua kasus ini objek "a" tidak dapat lagi membuat objek menggunakan operator baru. Jadi yang berikut ini salah
Objek matematika bawaan adalah typeof === 'objek' . Oleh karena itu objek baru tipe Math tidak dapat dibuat oleh operator baru.
Perhatikan juga bahwa fungsi Object , Array dan RegExp dapat membuat objek baru tanpa menggunakan operator baru . Namun yang mengikuti tidak.
Fungsi yang ditentukan pengguna adalah case khusus.
Karena objek tipe Fungsi dapat membuat objek baru, mereka juga disebut Konstruktor .
Setiap Konstruktor / Fungsi (baik bawaan atau yang ditentukan pengguna) saat didefinisikan secara otomatis memiliki properti yang disebut "prototipe" yang nilainya secara default ditetapkan sebagai objek. Objek ini sendiri memiliki properti yang disebut "konstruktor" yang secara default merujuk kembali kepada Konstruktor / Fungsi .
Misalnya ketika kita mendefinisikan suatu fungsi
berikut secara otomatis terjadi
Properti "prototipe" ini hanya ada di objek tipe Fungsi (dan tidak pernah di objek tipe Fungsi ).
Ini karena ketika objek baru dibuat (menggunakan operator baru) ia mewarisi semua properti dan metode dari objek prototipe fungsi Constructor saat ini yaitu referensi internal dibuat dalam objek yang baru dibuat yang mereferensikan objek yang dirujuk oleh objek prototipe fungsi Constructor saat ini.
Ini "referensi internal" yang dibuat dalam objek untuk referensi properti diwariskan dikenal sebagai prototipe objek (yang referensi objek direferensikan oleh Konstruktor "prototipe" properti tetapi berbeda dari itu). Untuk objek apa pun (Fungsi atau Tidak Fungsi) ini dapat diambil menggunakan metode Object.getPrototypeOf () . Menggunakan metode ini orang dapat melacak rantai prototipe suatu objek.
Juga, setiap objek yang dibuat ( tipe Fungsi atau tipe Non Fungsi ) memiliki properti "konstruktor" yang diwarisi dari objek yang dirujuk oleh properti prototipe fungsi Konstruktor. Secara default, properti "konstruktor" ini merujuk fungsi Konstruktor yang membuatnya (jika prototipe " Fungsi " default Constructor tidak diubah).
Untuk semua objek tipe Fungsi , fungsi konstruktor selalu berfungsi Function () {}
Untuk objek tipe Non Function (mis. Javascript Built in Math object) fungsi konstruktor adalah fungsi yang membuatnya. Untuk objek Math, ini adalah function Object () {} .
Semua konsep yang dijelaskan di atas dapat sedikit menakutkan untuk dipahami tanpa kode pendukung. Silakan pergi melalui baris kode berikut untuk memahami konsep. Cobalah untuk mengeksekusinya agar memiliki pemahaman yang lebih baik.
Rantai prototipe setiap objek akhirnya melacak kembali ke Object.prototype (yang itu sendiri tidak memiliki objek prototipe). Kode berikut dapat digunakan untuk melacak rantai prototipe suatu objek
Rantai prototipe untuk berbagai objek bekerja sebagai berikut.
Untuk membuat objek tanpa prototipe gunakan yang berikut ini:
Orang mungkin berpikir bahwa menyetel properti prototipe Konstruktor ke nol harus membuat objek dengan prototipe nol. Namun dalam kasus seperti itu prototipe objek yang baru dibuat diatur ke Object.prototype dan konstruktornya diatur untuk berfungsi Object. Ini ditunjukkan oleh kode berikut
Berikut ringkasan artikel ini
Hanya objek tipe Fungsi yang dapat membuat objek baru menggunakan operator baru . Objek yang dibuat adalah objek tipe Non Function . The Non Fungsi jenis benda tidak dapat lebih membuat objek menggunakan operator baru .
Semua objek tipe fungsi secara default memiliki properti "prototipe" . Properti "prototipe" ini merujuk objek yang memiliki properti "konstruktor" yang secara default mereferensikan objek tipe Function itu sendiri.
Semua objek ( tipe Fungsi dan tipe Non Fungsi ) memiliki properti "konstruktor" yang secara default mereferensikan objek tipe Fungsi / Konstruktor yang membuatnya.
Setiap objek yang dibuat secara internal mereferensikan objek yang dirujuk oleh properti "prototype" dari Constructor yang membuatnya. Objek ini dikenal sebagai prototipe objek yang dibuat (yang berbeda dari objek Tipe fungsi "prototipe" properti yang dirujuk). Dengan cara ini objek yang dibuat dapat secara langsung mengakses metode dan properti yang didefinisikan dalam objek yang dirujuk oleh properti "prototipe" Constructor (pada saat pembuatan objek).
Prototipe suatu objek (dan karenanya nama properti warisannya) dapat diambil menggunakan metode Object.getPrototypeOf () . Bahkan metode ini dapat digunakan untuk menavigasi seluruh rantai prototipe objek.
Rantai prototipe setiap objek akhirnya melacak kembali ke Object.prototype (Kecuali objek dibuat menggunakan Object.create (null) dalam hal objek tidak memiliki prototipe).
typeof (new Array ()) === 'objek' adalah dengan desain bahasa dan bukan kesalahan seperti yang ditunjukkan oleh Douglas Crockford
Menetapkan properti prototipe dari Konstruktor ke null (atau tidak terdefinisi, angka, benar, salah, string) tidak boleh membuat objek dengan prototipe nol. Dalam kasus seperti itu prototipe objek yang baru dibuat diatur ke Object.prototype dan konstruktornya diatur untuk berfungsi Object.
Semoga ini membantu.
sumber
Konsep
prototypal
pewarisan adalah salah satu yang paling rumit bagi banyak pengembang. Mari kita coba memahami akar masalah untuk memahami denganprototypal inheritance
lebih baik. Mari kita mulai dengan suatuplain
fungsi.Jika kami menggunakan
new
operator padaTree function
, kami menyebutnya sebagaiconstructor
fungsi.Setiap
JavaScript
fungsi memiliki aprototype
. Saat Anda masukTree.prototype
, Anda mendapatkan ...Jika Anda melihat
console.log()
output di atas , Anda bisa melihat properti konstruktorTree.prototype
dan__proto__
properti juga. Yang__proto__
menyatakanprototype
bahwa inifunction
didasarkan, dan karena ini hanyalah sebuah dataranJavaScript function
tanpainheritance
pengaturan, itu mengacu padaObject prototype
yang merupakan sesuatu yang baru saja dibangun di dalam JavaScript ...https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
Ini memiliki hal-hal seperti
.toString, .toValue, .hasOwnProperty
dll ...__proto__
yang dibawa mozilla saya sudah usang dan digantikan olehObject.getPrototypeOf
metode untuk mendapatkanobject's prototype
.Mari kita tambahkan metode ke
Tree
prototype
.Kami telah memodifikasi
Root
dan menambahkanfunction
cabang ke sana.Itu berarti ketika Anda membuat
instance
dariTree
, Anda dapat menyebutnya inibranch
metode.Kami juga dapat menambahkan
primitives
atauobjects
kePrototype
.Mari tambahkan
child-tree
keTree
.Di sini
Child
mewarisiprototype
dari Tree, apa yang kita lakukan di sini menggunakanObject.create()
metode untuk membuat objek baru berdasarkan apa yang Anda lewati, ini diaTree.prototype
. Dalam hal ini yang kami lakukan adalah mengatur prototipe Child ke objek baru yang terlihat identik denganTree
prototipe. Selanjutnya kita sedang mengaturChild's constructor to Child
, jika tidak, itu akan menunjuk keTree()
.Child
sekarang memiliki sendiriprototype
,__proto__
poin keTree
danTree's prototype
poin ke pangkalanObject
.Sekarang Anda membuat
instance
dariChild
dan panggilanbranch
yang awalnya tersedia dalamTree
. Kami belum benar - benar mendefinisikan kamibranch
diChild prototype
. TETAPI, diRoot prototype
mana Anak diwarisi dari.Dalam JS semuanya bukan objek, semuanya bisa bertindak seperti objek.
Javascript
memiliki primitif sepertistrings, number, booleans, undefined, null.
Mereka tidakobject(i.e reference types)
, tetapi tentu saja dapat bertindak sepertiobject
. Mari kita lihat contoh di sini.Di baris pertama cantuman ini,
primitive
nilai string ditetapkan ke nama. Baris kedua memperlakukan nama sepertiobject
dan memanggilcharAt(0)
menggunakan notasi titik.Inilah yang terjadi di balik layar: // apa yang
JavaScript
dilakukan mesinThe
String object
ada hanya untuk satu pernyataan sebelum itu hancur (suatu proses yang disebutautoboxing
). Mari kita kembali ke kitaprototypal
inheritance
.Javascript
mendukung warisan melaluidelegation
berbasis padaprototypes
.Function
memilikiprototype
properti, yang merujuk ke objek lain.properties/functions
dilihat dariobject
dirinya sendiri atau melaluiprototype
rantai jika tidak adaA
prototype
dalam JS adalah objek yangyields
Anda ke induk dari yang lainobject
. [mis. delegasi]Delegation
berarti bahwa jika Anda tidak dapat melakukan sesuatu, Anda akan memberitahu orang lain untuk melakukannya untuk Anda.https://jsfiddle.net/say0tzpL/1/
Jika Anda melihat biola di atas, anjing memiliki akses ke
toString
metode, tetapi itu tidak tersedia di dalamnya, tetapi tersedia melalui rantai prototipe yang didelegasikan kepadaObject.prototype
Jika Anda melihat yang di bawah ini, kami mencoba mengakses
call
metode yang tersedia di setiapfunction
.https://jsfiddle.net/rknffckc/
Jika Anda mencari biola di atas,
Profile
Function memiliki akses kecall
metode, tetapi itu tidak tersedia di dalamnya, tetapi tersedia melalui rantai prototipe yang didelegasikan kepadaFunction.prototype
Catatan:
prototype
adalah properti dari konstruktor fungsi, sedangkan__proto__
adalah properti dari objek yang dibangun dari konstruktor fungsi. Setiap fungsi dilengkapi denganprototype
properti yang nilainya kosongobject
. Ketika kita membuat turunan dari fungsi, kita mendapatkan properti internal[[Prototype]]
atau__proto__
yang referensi adalah prototipe dari Fungsiconstructor
.Diagram di atas terlihat agak rumit, tetapi menampilkan seluruh gambaran tentang cara
prototype chaining
kerjanya. Mari kita berjalan perlahan-lahan:Ada dua contoh
b1
danb2
, yang konstruktornyaBar
dan induknya adalah Foo dan memiliki dua metode dari rantai prototipeidentify
danspeak
viaBar
danFoo
https://jsfiddle.net/kbp7jr7n/
Jika Anda melihat kode di atas, kami memiliki
Foo
konstruktor yang memiliki metodeidentify()
danBar
konstruktor yang memilikispeak
metode. Kami membuat duaBar
contohb1
danb2
yang jenis induknyaFoo
. Sekarang saat memanggilspeak
metodeBar
, kami dapat mengidentifikasi siapa yang memanggil bicara melaluiprototype
rantai.Bar
sekarang memiliki semua metodeFoo
yang didefinisikan di dalamnyaprototype
. Mari kita menggali lebih jauh dalam memahamiObject.prototype
danFunction.prototype
dan bagaimana mereka terkait. Jika Anda mencari konstruktorFoo
,Bar
danObject
sedangFunction constructor
.The
prototype
dariBar
iniFoo
,prototype
dariFoo
isObject
dan jika Anda melihat dekat yangprototype
dariFoo
berhubungan denganObject.prototype
.Sebelum kita menutup ini, mari kita bungkus dengan sepotong kecil kode di sini untuk meringkas semua yang di atas . Kami menggunakan
instanceof
Operator di sini untuk memeriksa apakahobject
telah di-nyaprototype
rantaiprototype
properti dariconstructor
yang di bawah merangkum seluruh diagram besar.Saya harap ini menambahkan beberapa informasi, saya tahu ini agak bisa menjadi besar untuk dipahami ... dengan kata sederhana itu hanya benda yang terhubung ke objek !!!!
sumber
Antarmuka ke kelas standar menjadi dapat diperluas. Misalnya, Anda menggunakan
Array
kelas dan Anda juga perlu menambahkan serializer khusus untuk semua objek array Anda. Apakah Anda menghabiskan waktu mengkodekan subclass, atau menggunakan komposisi atau ... Properti prototipe menyelesaikan ini dengan membiarkan pengguna mengontrol set anggota / metode yang tersedia untuk kelas.Pikirkan prototipe sebagai pointer-vtable tambahan. Ketika beberapa anggota hilang dari kelas asli, prototipe tersebut dilihat saat runtime.
sumber
Mungkin membantu untuk mengkategorikan rantai prototipe menjadi dua kategori.
Pertimbangkan konstruktor:
Nilai
Object.getPrototypeOf(Person)
adalah fungsi. Faktanya, itu benarFunction.prototype
. KarenaPerson
dibuat sebagai fungsi, ia berbagi objek fungsi prototipe yang sama dengan semua fungsi. Itu sama denganPerson.__proto__
, tetapi properti itu tidak boleh digunakan. Bagaimanapun, denganObject.getPrototypeOf(Person)
Anda berjalan secara efektif menaiki tangga dari apa yang disebut rantai prototipe.Rantai ke arah atas terlihat seperti ini:
Person
→Function.prototype
→Object.prototype
(titik akhir)Penting adalah bahwa rantai prototipe ini tidak ada hubungannya dengan objek yang
Person
dapat dikonstruksi . Benda-benda yang dibangun memiliki rantai prototipe sendiri, dan rantai ini berpotensi tidak memiliki leluhur yang sama dengan yang disebutkan di atas.Ambil contoh objek ini:
p tidak memiliki hubungan prototipe-rantai langsung dengan Person . Hubungan mereka berbeda. Objek p memiliki rantai prototipe sendiri. Menggunakan
Object.getPrototypeOf
, Anda akan menemukan rantai sebagai berikut:p
→Person.prototype
→Object.prototype
(titik akhir)Tidak ada objek fungsi dalam rantai ini (meskipun itu bisa).
Jadi
Person
sepertinya terkait dengan dua jenis rantai, yang menjalani hidup mereka sendiri. Untuk "melompat" dari satu rantai ke rantai lain, Anda menggunakan:.prototype
: melompat dari rantai konstruktor ke rantai objek-yang dibuat. Properti ini hanya didefinisikan untuk objek fungsi (karenanew
hanya dapat digunakan pada fungsi)..constructor
: melompat dari rantai objek yang dibuat ke rantai konstruktor.Berikut ini adalah presentasi visual dari dua rantai prototipe yang terlibat, direpresentasikan sebagai kolom:
Untuk meringkas:
Tidak mengherankan bahwa nama properti
prototype
dapat menyebabkan kebingungan. Mungkin akan lebih jelas jika properti ini dinamaiprototypeOfConstructedInstances
atau sesuatu di sepanjang garis itu.Anda dapat melompat-lompat di antara dua rantai prototipe:
Simetri ini dapat dipecah dengan secara eksplisit menetapkan objek berbeda ke
prototype
properti (lebih lanjut tentang itu nanti).Buat satu Fungsi, Dapatkan Dua Objek
Person.prototype
adalah objek yang dibuat bersamaan dengan fungsiPerson
yang dibuat. MemilikiPerson
sebagai konstruktor, meskipun konstruktor itu belum benar-benar mengeksekusi. Jadi dua objek dibuat secara bersamaan:Person
sendiriKeduanya adalah objek, tetapi mereka memiliki peran yang berbeda: objek fungsi membangun , sedangkan objek lainnya mewakili prototipe objek yang akan dibangun oleh fungsi. Objek prototipe akan menjadi induk dari objek yang dibangun dalam rantai prototipe.
Karena fungsi juga merupakan objek, ia juga memiliki induknya sendiri dalam rantai prototipenya sendiri, tetapi ingat bahwa kedua rantai ini adalah tentang hal-hal yang berbeda.
Berikut adalah beberapa persamaan yang dapat membantu memahami masalah ini - semua cetak ini
true
:Menambahkan level ke rantai prototipe
Meskipun objek prototipe dibuat ketika Anda membuat fungsi konstruktor, Anda dapat mengabaikan objek itu, dan menetapkan objek lain yang harus digunakan sebagai prototipe untuk setiap kejadian selanjutnya yang dibuat oleh konstruktor itu.
Contohnya:
Sekarang rantai prototipe t adalah satu langkah lebih lama dari pada p :
t
→p
→Person.prototype
→Object.prototype
(titik akhir)Rantai prototipe lain tidak lagi:
Thief
danPerson
saudara kandung berbagi orangtua yang sama dalam rantai prototipe mereka:Person
}Thief
} →Function.prototype
→Object.prototype
(titik akhir)Grafik yang disajikan sebelumnya dapat diperpanjang ke ini (aslinya
Thief.prototype
ditinggalkan):Garis biru mewakili rantai prototipe, garis berwarna lainnya mewakili hubungan lain:
sumber
Panduan Definitif untuk Berorientasi Objek JavaScript - penjelasan video yang sangat singkat dan jelas ~ 30 menit dari pertanyaan yang diajukan (topik Warisan prototipe dimulai dari 5:45 , meskipun saya lebih suka mendengarkan seluruh video). Penulis video ini juga membuat situs web visualizer objek JavaScript http://www.objectplayground.com/ .
sumber
Saya merasa bermanfaat untuk menjelaskan "rantai prototipe" sebagai konvensi rekursif ketika
obj_n.prop_X
dirujuk:jika
obj_n.prop_X
tidak ada, periksa diobj_n+1.prop_X
manaobj_n+1 = obj_n.[[prototype]]
Jika
prop_X
akhirnya ditemukan dalam objek prototipe k-th makaobj_1.prop_X = obj_1.[[prototype]].[[prototype]]..(k-times)..[[prototype]].prop_X
Anda dapat menemukan grafik hubungan objek Javascript dengan propertinya di sini:
http://jsobjects.org
sumber
Ketika konstruktor membuat objek, objek tersebut secara implisit mereferensikan properti "prototipe" konstruktor untuk tujuan menyelesaikan referensi properti. Properti "prototipe" konstruktor dapat dirujuk oleh ekspresi program constructor.prototype, dan properti yang ditambahkan ke prototipe objek dibagikan, melalui warisan, oleh semua objek yang berbagi prototipe.
sumber
Ada dua entitas berbeda namun terkait di sini yang perlu dijelaskan:
.prototype
properti fungsi.[[Prototype]]
[1] dari semua objek [2] .Ini adalah dua hal yang berbeda.
The
[[Prototype]]
properti:Ini adalah properti yang ada di semua [2] objek.
Apa yang disimpan di sini adalah objek lain, yang, sebagai objek itu sendiri, memiliki objeknya sendiri
[[Prototype]]
yang menunjuk ke objek lain. Objek lain itu memiliki objeknya[[Prototype]]
sendiri. Kisah ini berlanjut hingga Anda mencapai objek prototipikal yang menyediakan metode yang dapat diakses pada semua objek (seperti.toString
).The
[[Prototype]]
properti adalah bagian dari apa membentuk[[Prototype]]
rantai. Rantai[[Prototype]]
objek ini adalah apa yang diperiksa ketika, misalnya,[[Get]]
atau[[Set]]
operasi dilakukan pada objek:The
.prototype
properti:Ini adalah properti yang hanya ditemukan di fungsi.Menggunakan fungsi yang sangat sederhana:
The
.prototype
properti memegang sebuah benda yang akan ditugaskan untukb.[[Prototype]]
ketika Anda melakukanvar b = new Bar
. Anda dapat dengan mudah memeriksa ini:Salah satu yang paling penting
.prototype
adalah bahwa dariObject
fungsi . Prototipe ini memiliki objek prototipikal yang[[Prototype]]
berisi semua rantai. Di atasnya, semua metode yang tersedia untuk objek baru didefinisikan:Sekarang, karena
.prototype
merupakan objek, ia memiliki[[Prototype]]
properti. Ketika Anda tidak membuat tugas apa pun untukFunction.prototype
,.prototype
's[[Prototype]]
menunjuk ke objek prototipikal (Object.prototype
). Ini dilakukan secara otomatis kapan pun Anda membuat fungsi baru.Dengan cara ini, setiap kali Anda melakukan
new Bar;
rantai prototipe diatur untuk Anda, Anda mendapatkan semua yang ditetapkanBar.prototype
dan semuanya ditetapkanObject.prototype
:Kapan kamu melakukan tugas make untuk
Function.prototype
semua yang Anda lakukan adalah memperpanjang rantai prototipe untuk menyertakan objek lain. Ini seperti penyisipan dalam daftar yang terhubung sendiri.Ini pada dasarnya mengubah
[[Prototype]]
rantai yang memungkinkan properti yang didefinisikan pada objek yang ditugaskan untukFunction.prototype
dilihat oleh objek apa pun yang dibuat oleh fungsi.[1: Itu tidak akan membingungkan siapa pun; disediakan melalui satu
__proto__
properti di banyak implementasi.[2]: Semua kecuali
null
.sumber
Biarkan saya memberi tahu Anda pemahaman saya tentang prototipe. Saya tidak akan membandingkan warisan di sini dengan bahasa lain. Saya berharap orang-orang berhenti membandingkan bahasa, dan hanya memahami bahasa itu sendiri. Memahami prototipe dan pewarisan prototipe sangat sederhana, seperti yang akan saya tunjukkan di bawah ini.
Prototipe seperti model, berdasarkan mana Anda membuat produk. Poin penting untuk dipahami adalah bahwa ketika Anda membuat objek menggunakan objek lain sebagai prototipe, tautan antara prototipe dan produk tersebut akan bertahan lama. Contohnya:
Setiap objek berisi properti internal yang disebut [[prototipe]], yang dapat diakses oleh
Object.getPrototypeOf()
fungsinya.Object.create(model)
membuat objek baru dan menyetel properti [[prototipe]] ke model objek . Maka ketika Anda melakukannyaObject.getPrototypeOf(product)
, Anda akan mendapatkan model objek .Properti dalam produk ditangani dengan cara berikut:
Seperti menghubungkan objek menggunakan properti prototipe disebut pewarisan prototypal. Itu, sangat sederhana, setuju?
sumber
Upaya lain untuk menjelaskan warisan berbasis prototipe JavaScript dengan gambar yang lebih baik
sumber
Pertimbangkan
keyValueStore
objek berikut :Saya dapat membuat instance baru dari objek ini dengan melakukan ini:
Setiap instance objek ini akan memiliki properti publik berikut:
data
get
set
delete
getLength
Sekarang, misalkan kita membuat 100 instance dari
keyValueStore
objek ini . Meskipunget
,set
,delete
,getLength
akan melakukan hal yang sama persis untuk setiap 100 kasus ini, setiap contoh memiliki salinan dari fungsi ini.Sekarang, bayangkan jika Anda bisa memiliki hanya satu yang
get
,set
,delete
dangetLength
copy, dan setiap contoh akan referensi bahwa fungsi yang sama. Ini akan lebih baik untuk kinerja dan membutuhkan lebih sedikit memori.Di situlah prototipe masuk. Prototipe adalah "cetak biru" dari properti yang diwarisi tetapi tidak disalin oleh instance. Jadi ini berarti bahwa ia hanya ada satu kali dalam memori untuk semua instance objek dan dibagi oleh semua instance tersebut.
Sekarang, pertimbangkan
keyValueStore
objek itu lagi. Saya bisa menulis ulang seperti ini:Ini PERSIS sama dengan versi
keyValueStore
objek sebelumnya, kecuali bahwa semua metode sekarang dimasukkan ke dalam prototipe. Apakah ini berarti, adalah bahwa semua 100 contoh sekarang berbagi empat metode ini daripada masing-masing memiliki salinan mereka sendiri.sumber
Ringkasan:
new
kata kunci objek mendapat prototipe. Referensi ke prototipe ini dapat ditemukan di__proto__
properti objek yang baru dibuat.__proto__
Properti ini merujuk keprototype
properti fungsi konstruktor.Contoh:
Mengapa ini berguna:
Javascript memiliki mekanisme ketika mencari properti pada Objects yang disebut 'prototypal inheritance' , berikut adalah apa yang pada dasarnya dilakukan:
Sebagai contoh:
Memperbarui:
The
__proto__
properti telah usang, meskipun diimplementasikan di sebagian besar browser modern cara yang lebih baik untuk mendapatkan referensi objek prototipe akan menjadi:Object.getPrototypeOf()
sumber
Saya selalu menyukai analogi untuk memahami hal semacam ini. 'Warisan prototipe' cukup membingungkan dibandingkan dengan pewarisan bass kelas menurut pendapat saya, meskipun prototipe adalah paradigma yang lebih sederhana. Sebenarnya dengan prototipe, benar-benar tidak ada warisan, jadi nama itu sendiri menyesatkan, itu lebih merupakan jenis 'delegasi'.
Bayangkan ini ....
Anda berada di sekolah menengah, dan Anda berada di kelas dan memiliki kuis yang dijadwalkan hari ini, tetapi Anda tidak memiliki pena untuk mengisi jawaban Anda. Doh!
Anda duduk di sebelah teman Anda, Finnius, yang mungkin memiliki pena. Anda bertanya, dan dia melihat sekeliling mejanya dengan tidak berhasil, tetapi alih-alih mengatakan "Saya tidak punya pena", dia adalah teman baik yang dia tanyakan kepada temannya yang lain Derp jika dia punya pena. Derp memang memiliki pena cadangan dan menyerahkannya kembali ke Finnius, yang menyerahkannya kepada Anda untuk menyelesaikan kuis Anda. Derp telah mempercayakan pena itu ke Finnius, yang telah mendelegasikan pena itu untuk Anda gunakan.
Yang penting di sini adalah bahwa Derp tidak memberikan pena kepada Anda, karena Anda tidak memiliki hubungan langsung dengannya.
Ini, adalah contoh sederhana tentang cara kerja prototipe, tempat pohon data dicari untuk hal yang Anda cari.
sumber
skema lain yang menunjukkan __proto__ , prototipe , dan hubungan konstruktor :
sumber
Hanya saja Anda sudah memiliki objek dengan
Object.new
tetapi Anda masih belum memiliki objek saat menggunakan sintaks konstruktor.sumber
Referensi: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes
sumber
The Prototype menciptakan objek baru dengan kloning yang ada objek . Jadi benar-benar ketika kita berpikir tentang prototipe kita benar-benar dapat berpikir kloning atau membuat salinan sesuatu daripada mengada-ada.
sumber