为什么最后一行在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
答案 1 :(得分:2)
那是因为myBoat.__proto__
不是一个函数,而是一个对象,因此它不包含prototype
属性。你可以试试这个:
console.log(myBoat.__proto__.constructor.prototype);
答案 2 :(得分:1)
每个对象都有一个原型,但prototype
属性仅适用于函数或函数对象。否则,可以使用除IE之外的所有浏览器中的__proto__
标识符来访问对象的原型。
如果__proto__
不可用,可以从构造函数属性获取原型,如myBoat.constructor.prototype