2014-02-06 88 views
1

爲什麼最後一行在JavaScript中評估爲undefined?這爲什麼評估爲未定義在JavaScript中?

function Boat() {} 

var myBoat = new Boat(); 

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

console.log(myBoat.__proto__); //Boat(){} 

console.log(myBoat.__proto__.prototype); //undefined - why is this not Boat(){} 
+0

? –

回答

4

__proto__屬性是指實例構造函數的原型。所以,你的第二個例子記錄完全相同的對象作爲第一個:

Boat.prototype === myBoat.__proto__; 

Boat.prototype原型是undefined因爲Boat.prototype不是一個函數。事實上,它是有效的Object這樣一個實例:

Boat.prototype.__proto__ === Object.prototype; 

並通過擴展:

myBoat.__proto__.__proto__ === Object.prototype; 

附註 - 使用__proto__財產已被棄用。 Object.getPrototypeOf應當代替在可能使用:

Boat.prototype === Object.getPrototypeOf(myBoat); // Equivalent to 1st example 
+0

@cookiemonster - 它指對象的內部'[[Prototype]]'屬性,在這種情況下,它是構造函數的原型(如'myBoat .__ proto__ === Boat.prototype'所示。 –

2

這是因爲myBoat.__proto__不是一個函數,而是一個對象,因此它並不擁有這個prototype財產。你可以試試這個:

console.log(myBoat.__proto__.constructor.prototype); 
1

每個對象都有一個原型,但是prototype屬性僅對功能或函數對象可用。否則,可以在除IE以外的所有瀏覽器中使用__proto__標識符訪問對象的原型。

如果__proto__不可用,原型可以從構造屬性,您有沒有注意到,`myBoat.prototype`也是`undefined`獲得這樣myBoat.constructor.prototype

相關問題