为什么在JavaScript中评估为未定义?

时间:2014-02-06 13:08:41

标签: javascript prototype

为什么最后一行在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(){}

3 个答案:

答案 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

答案 1 :(得分:2)

那是因为myBoat.__proto__不是一个函数,而是一个对象,因此它不包含prototype属性。你可以试试这个:

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

答案 2 :(得分:1)

每个对象都有一个原型,但prototype属性仅适用于函数或函数对象。否则,可以使用除IE之外的所有浏览器中的__proto__标识符来访问对象的原型。

如果__proto__不可用,可以从构造函数属性获取原型,如myBoat.constructor.prototype