2016-12-19 61 views
0

我有一段修改過的代碼,來自在線來源,討論原型繼承。在Javascript中使用原型繼承

var myObj = function() {}; // start w a regular func 

myObj.prototype.a = 1; // attach properties to property 
myObj.prototype.b = 2; 

console.log('myObj dir a is: ' + myObj.a); // undefined 

var myRealObj = new myObj(); 
console.log('my real obj a is: ' + myRealObj.a); // works 

我的一點混淆是第一個日誌語句,其中a是未定義的。即使它在原型鏈上方,它的功能是否應該不走鏈?當我使用new來創建對象時,爲什麼它會工作?

謝謝!

+0

你爲什麼想到'myObj.prototype.a'是同樣的事情'myObj.a'?他們不是。原型是這樣的例子,而不是構造函數。 – Xufox

+0

不要混淆構造函數的'.prototype'屬性和它的原型鏈。 – Bergi

回答

0

myObj.prototype僅在使用new關鍵字時才被設置爲實例原型鏈的一部分。如果沒有使用new關鍵字,則不存在原型鏈關係。

當使用new關鍵字,你能想象下面的代碼是「注入」到一個構造函數:

var myObj = function() { 
    var this = Object.create(myObj.prototype); // which creates an empty object 
           // with myObj.prototype on its prototype chain 

    // your code here... 

    return this; 
}; 
+0

它被設置爲'myRealObj'的原型鏈的一部分,從來沒有'myObj'的一個 – Bergi

1

你的困惑與區別源於一個「構造函數」和物體之間(使用new關鍵字時從該功能(實例)創建的)。

在寫入到控制檯你的第一次嘗試,你有沒有實際調用構造函數:

// The "a" property won't exist because "myObj" isn't being invoked 
console.log('myObj dir a is: ' + myObj.a); 

功能必須用括號和構造函數也必須用new爲了得到被調用來調用a 從它們創建的對象。

因此,在第一次嘗試你沒有收到一個對象實例,所以你得到undefined。然而,prototype對象確實存在,在這一點上,所以如果你這樣寫:

console.log('myObj dir a is: ' + myObj.prototype.a); 

你會得到屬性值。

在第二次嘗試中,您確實使用了構造函數來創建對象實例。該新實例繼承自其指定的原型,因此它獲得原型的ab屬性。

該調用隱式返回對已創建的新實例的引用,並且您使用myRealObj變量捕獲該引用。

0

有點令人困惑的是,myObj.prototype不是myObj的原型,它是通過使用myObj作爲構造函數創建的新對象所具有的原型。

MyObj中的原型是myObj.__proto__