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 diberi null
nilai untuk properti ini, pada saat penciptaannya.
Bagaimana cara mendapatkan prototipe objek?
melalui __proto__
atauObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
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 khusus a
dan menyimpan kode fungsi aktif sebagai constructor
aktif prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
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 ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
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__
dan prototype
?
__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:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
berbeda dariconstructor.prototype
?