为什么这会在JavaScript中评估未定义



为什么最终行评估为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(){}

__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

那是因为 myBoat.__proto__不是一个函数,而是对象,因此它不会引起 prototype属性。您可以尝试一下:

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

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

如果__proto__不可用,则可以从 myBoat.constructor.prototype

等构造函数获得原型

最新更新