2015-05-07 17 views
5

JavaScript prototipini anlamaya çalışıyorum ve biraz kafam karıştı. Orada tonlarca öğretici var ve bunların her birinde farklı bir açıklaması var. Yani nereden başlayacağımı bilmiyorum. Ben basit bir JavaScript nesnesiBasit JavaScript nesnesinde neden prototip mevcut değil

var a = {flag : 1} 

MDN yılında oluşturduk Şimdiye kadar

, ben JavaScript

Tüm nesneler Nesne

türediğini öne okumak Ama 'edemezdim Bu nesnenin prototipini bulmak a.prototype bana 0 veriyor

Daha sonra prototipin a.constructor.prototype numaralı sayfada bulunduğunu buldum. Bir işlev oluşturduğumda var myfunc = function() {} ve sonra myfunc.prototype kullanılabilir. Yani prototip özelliği, nesneler üzerinde değil, işlevlerde kullanılabilir.

Lütfen bunu anlamama yardımcı olun ve bu a.constructor.

Her türlü yardım büyük beğeni topluyor.

+0

Bu tam soru bir hafta önce soruldu ve yanıtladı. Yinelenmeyi bulmaya çalışacağım. – jfriend00

+0

var a = {}; yeni Object() için kısa yoldur. Bildiğiniz tüm nesnelerin köküdür – Haagenti

+0

Başka bir yinelenen açıklama: [Nesne hazırlamasında prototip genişletme] (http://stackoverflow.com/questions/29977892/extending-prototype-on-object-literal/29977926#29977926) – jfriend00

cevap

1

Her fonksiyonu (new anahtar sözcüğüyle) yapıcı olarak çağrılabilir:

aşağıdaki çalıştırmak, tarayıcı DevTools'un bu görmek için. tarayıcılarda

function Dog() { 
    this.legs = 4; 
} 

normal bir fonksiyonu var dog = Dog() olarak diyoruz, o tanımlayacaktır window.legs4 (biraz farklı ama node.js içinde eğer ilgili bir şey) olacak ve undefined için dog ayarlayın. Bir yapıcı olarak dersek

Ancak, var dog = new Dog() olarak, yeni bir nesne yapmak ve set onun constructor bu işleve ve dog için bu yeni nesneyi atar. Dahili prototipini ( tarayıcısında dog.__proto__ olarak erişilebilen) yapıcının prototipine (Dog.prototype) ayarlayacaktır. Veya, pseudocode,

var dog = { 
    legs: 4 
}; 
dog.constructor = Dog; 
dog.__proto__ = Dog.prototype; // same as dog.constructor.prototype 

Böylece dog.constructor.prototype, değil kesinlikle, dog prototipini konuşursak, yapıcı işlevi çalıştırıldığında prototip atanan alacak nesnedir. Ve özellikle, Dog.prototype, Dog işlevinin prototipini (sadece örneklerinin alacağı prototip) 'dur. İşlevsiz işlevlerde prototype nedeninin bulunmaması, işlev dışı işlevlerin yapıcı olarak kullanılamayacağından, bunu yapmanın bir anlamı yoktur (tek işlevi, oluşturulmuş örnek nesneler '__proto__'a kopyalanacağı için).

Örneğindeki nesnenin hala bir prototipi vardır, ancak doğrudan erişilemez; Tarayıcılara izin veren (a.__proto__) ya da tarayıcıya güzel bir şekilde (Object.getPrototypeOf(a)) izin verebilirsiniz.

+0

Bu harika cevap için teşekkürler. Pseudocode dog .__ proto__ = Dog.constructor.prototype; Ama dog .__ proto__ == Dog.constructor.prototype 'false' gösteriyor Lütfen açıklar mısınız. – Wishnu

+0

Typo, üzgünüm. "Dog.constructor.prototype" olmalıdır ("Dog.prototype" ile aynıdır). Düzenlenen. – Amadan

+0

Bu satırı açıklar mısınız "Ve özellikle, Dog.prototype, Köpek işlevinin prototipini değil (sadece örneklerinin edineceği prototiptir)" – Wishnu

2

Object prototipini döndürmek için Object.getPrototypeOf()'u kullanabilirsiniz.

var a = {flag: 1}; 
console.dir(Object.getPrototypeOf(a)); 
+0

Teşekkürler Cevap için – Wishnu

İlgili konular