JS'yi bilmiyorum prototipini öğreniyorum : bu & Nesne Prototipleri , altındaki tasarımı anlamak ve çok fazla yanlış anlaşılmayı açıklamak için harika bir kitap (bu yüzden miras ve benzeri şeyleri kullanmaktan kaçınmaya çalışıyorum instanceof
).
Ama insanların burada sorduğu soruların aynısı var. Birkaç cevap gerçekten yararlı ve aydınlatıcı. Ayrıca anlayışlarımı paylaşmak isterim.
Prototip nedir?
JavaScript'teki nesneler, spesifikasyonda belirtilen [[Prototype]]
başka bir nesneye referans olan dahili bir özelliğe sahiptir. Hemen hemen tüm nesnelere, null
oluşturuldukları sırada bu özellik için bir değer verilmez .
Bir nesnenin prototipi nasıl alınır?
yoluyla __proto__
veyaObject.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
Nedir prototype
?
prototype
otomatik olarak bir fonksiyonun özel bir özelliği olarak yaratılan ve delegeleme (miras) zincirini, yani prototip zincirini oluşturmak için kullanılan bir nesnedir .
Biz bir işlev oluşturduğunuzda a
, prototype
otomatik olarak özel bir özelliği olarak oluşturulur a
ve olarak işlev kodunu kaydeder constructor
tarihinde adlı prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Bu özelliği bir işlev nesnesinin özelliklerini (yöntemler dahil) depolamak için bir yer olarak düşünmek isterim. Bu da JS fayda fonksiyonları gibi tanımlanır sebebi bu Array.prototype.forEach()
, Function.prototype.bind()
,Object.prototype.toString().
Neden bir fonksiyonun özelliğini vurgulamak gerekir ?
{}.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();
Yani, Arary
, Function
, Object
tüm fonksiyonlar bulunmaktadır. Bunun JS hakkındaki izlenimi yenilediğini itiraf etmeliyim. İşlevlerin JS'de birinci sınıf vatandaş olduğunu biliyorum, ancak işlevler üzerine kurulu gibi görünüyor.
Arasındaki fark nedir __proto__
ve prototype
?
__proto__
bir başvuru , kendi özelliğine başvurmak için her nesne üzerinde çalışır [[Prototype]]
.
prototype
otomatik olarak bir işlevin özel bir özelliği olarak oluşturulan ve bir işlev nesnesinin özelliklerini (yöntemler dahil) depolamak için kullanılan bir nesnedir.
Bu ikisiyle, prototip zincirini zihinsel olarak haritalayabiliriz. Bu resimde gösterildiği gibi:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
farklıconstructor.prototype
?