2016-04-10 26 views
2

var soru, belki biraz sıradışı, bir fonksiyonun prototip hakkında, bu kodu görmek ve konsol çıkışını temsil eden yorumları dikkat:anlayış fonksiyon prototip ve __proto__

function Foo() { 
 
}; 
 

 
var o = Foo.prototype; 
 

 
console.log(o.__proto__); // Object {} 
 
console.log(o.constructor); // function Foo() {} 
 
console.log(o.__proto__.constructor); // function Object() { [native code] } 
 

 
console.log(o.__proto__.constructor === o.constructor); // false

Lütfen Standart getPrototypeOf() yerine __proto__ kullanıyorum.

Son satırın neden false çıktısını bulmaya çalışıyorum. Biz genellikle herhangi aşağıdaki nesne için doğru olduğunu biliyoruz:

obj.__proto__.constructor === obj.constructor

bu o çok bir nesnedir yukarıdaki o durumunda değil anlamak için bekliyorum. o aslında bir işlevin prototip örneği (Foo.prototype) ve bu nedenle Foo kurulumu sırasında Foo için o.constructor set alır çünkü yanlış ise

merak ediyorum.

Bunun çok kullanışlı bir yardımcı programın bulunmadığını biliyorum, ancak bazı şeyleri anlamakta fayda var.

+0

"* Genelde aşağıdaki her nesne için doğru olduğunu biliyoruz:' obj .__ proto __. Constructor === obj.constructor' * "- kendi' .constructor' özelliği olmayan herhangi bir nesne, yani. Ve 'Foo.prototype' * *,' Foo'ya işaret eden, kendi 'kurucu' özelliği vardır. – Bergi

+0

@Bergi herhangi bir nesne bence bir 'kurucu' özelliği var. 'Constructor' özelliğine sahip 'Object.prototype' öğesinden 'devralındı'. Ne demek istediğinden emin değilim, eğer biraz detaylandırırsan, bu yararlı olur, teşekkürler. –

+0

Kalıtsal olmayanları değil, kendi özelliklerini kastediyorum. Ve 'Object.prototype' öğesinden devralmayan nesneler bile oluşturabilir, böylece bir '.constructor' özelliği olmaz (Object.create (null)' '' '' constructor '' (false) – Bergi

cevap

3

Bu bir değişmez değildir:

Object.getPrototypeOf(obj).constructor === obj.constructor 

Bunun yerine, sadece bu genellikle insanların nesnelere özel constructor özelliklerini katmayan, ve en nesneleri yapıcısının prototype nesneler değildir. Bu nedenle, constructor özelliğine eriştiğinizde, [[Prototype]] öğesinden (varsa) alınan değeri alırsınız.

function Foo(){} 
Foo.prototype.constructor; // Foo (own property) 
new Foo().constructor; // Foo (inherited from Foo.prototype) 

Ancak, yapıcı prototype nesneler onların [[Prototip]] (varsa) ait constructor daha genellikle farklıdır varsayılan olarak kendi constructor özelliği, var.

function Foo(){} 
Foo.prototype.constructor; // Foo (own property) 
var proto = Object.getPrototypeOf(Foo.prototype); // Object.prototype 
proto.constructor; // Object (own property of proto/Object.prototype) 

özel bir şey hakkında constructor, bu örneğinden yapıcı yardımcı olmak için yapıcı bir prototype nesnelerde otomatik olarak oluşturulur sadece normal bir özelliktir var unutmayın. Ancak bunu değiştirebilir, silebilir veya gölgelebilirsiniz.

+0

'/Ancak, yapıcılar/Ancak, prototipler/'iiuc – Siguza

+0

@Oriol: Teşekkürler. Foo.prototype 'oluşturulduğunda,' foo.prototype.constructor ''in Object.getPrototypeOf (Foo.prototype) .constructor'dan farklı olduğunu söylemek doğru olur, çünkü JS motoru Foo.prototype gibi bir şey yaptı. constructor = Foo ', ve bu şekilde "Object.prototype.constructor" kaynağından "constructor" özellik değerini "değiştirdi"? –

+0

Sadece birileri, bazı JS motorlarının gerçek C++ kodlarına dayanarak, prototip ve 'kurucunun' Fonksiyon 've 'Nesne' için nasıl ayarlandığını göstermek için blog yazabilir veya bazı sahte kodları gösteren bir yere yazabilirler. Bu şeyler JS –