2016-03-23 34 views
1

Şu anda StackOverflow'taki makalelerin çoğuna rağmen, prototiplerle gerçekten çok karıştım..prototype ve [[prototype]]. Neden .prototype boş bir nesne?

function Foo() { 

} 

Foo.prototype.speak = function() { 
    console.log('Foo'); 
}; 

function Bar() { 

} 

console.log(Bar.prototype); // {} 

Bar.prototype = Object.create(Foo.prototype); 

console.log(Bar.prototype); // {} ----- (1) 

Bar.prototype.speak = function() { // ----------(2) 
    console.log('Bar'); 
}; 

console.log(Bar.prototype); // { speak: [Function] } ----- (3) 

Soru:

1) neden Object.create sonra (1) boş amacıdır. speak method ile Foo arasındaki bir nesneyi dönüştürmemeli mi?

2) Gerçekten ne değiştiriyorum (2) ?? Bar nesnesi veya prototype nesnesi? Gerçekte ne oluyor?

3) Ne oluyor (3).

4) [[prototip]] tüm bunlarla nasıl ilişkilidir? Bildiğim şey, [[prototype]], geçerli nesne bir özellik içermiyorsa, aramak için kullanılır.

Emin olmak için .prototype !== [[prototype]] ama [[prototype]] === __proto__?

Bu bir kopya ise üzgünüz. Çünkü benzer sorulara rağmen bu sorulara cevap veremiyorum.

+1

Object.create bir nesneyi kopyalamaz, ilettiğiniz nesneye atanmış prototip ile bir tane oluşturur. Eğer '(yeni Bar())' yı çağırmayı denerseniz. Speak(); 'sonra (1) iş (ve çıktı "Foo") Prototip zinciriniz, düşündüğünüz yerden kaldırılmış bir nesnedir. Console.log (Bar.prototype.prototype) ' – david

+0

'u deneyin. Ne gördüğünüzü açıklamanın diğer bir yolu da, konsol.log'un prototip zincirinde bulunabilecek tüm özellikleri/yöntemi değil, yalnızca nesnenin' ownProperties'ini çıkarmasıdır. . Tüm zincirin görüntülenmesini isterseniz kendi kayıt fonksiyonunuzu yazın. – GameAlchemist

cevap

-1

Bir işlevin/nesnenin prototipini, onu atamaya çalışarak değiştiremezsiniz. Nesne oluşturma zamanında ayarlamanız gerekir veya değiştirmek için ES6 özelliklerini kullanmalısınız.

Bar.prototype = Object.create(Foo.prototype); herhangi bir anlam ifade etmemektedir. Bir nesnenin gerçek prototipinin iç temsilidir.

Muhtemelen test vakanızı bu temellere göre yeniden ayarlamalı ve açıklama istemeniz gerekir.