如果我可以使用 obj.constructor.prototype 来访问对象的原型
你一般不能。考虑这种方法的工作原理:
var proto = MyConstructor.prototype;
// has an (nonenumberable) property "constructor"
proto.hasOwnProperty("constructor"); // `true`
// that points [back] to
proto.constructor; // `function MyConstructor() {…}`
如您所见,这是一个循环的属性结构。当你这样做
var o = new MyConstructor();
// and access
o.constructor; // `function MyConstructor() {…}`
// then it yields the value that is inherited from `proto`
// as `o` doesn't have that property itself:
o.hasOwnProperty("constructor"); // `false`
但这仅适用于从原型对象o
继承constructor
属性的对象,并且该对象具有指向原型对象的有用值。考虑到
var o = {};
o.constructor = {prototype: o};
哎呀。在这里访问会o.constructor.prototype
产生o
本身,它可能是任何其他无意义的值。结构实际上与上面的相同MyConstructor.prototype
- 如果您访问proto.constructor.prototype.constructor.prototype[.constructor.prototype…]
,您将不会得到任何其他东西,而只是proto
.
那为什么我不能obj.constructor.prototype.constructor.prototype
用来遍历原型链而不得不使用Object.getPrototypeOf
呢?
因为您被困在循环结构中,因为MyConstructor.prototype
) 本身具有该constructor
属性,而不是继承自Object.prototype
. 为了真正获得下一个对象真正的原型链,您必须使用Object.getPrototypeOf
.
var o = new MyConstructor();
console.log(o.constructor.prototype) // MyConstructor
其实应该是的MyConstructor.prototype
。Chrome 控制台有时会在显示未命名对象的有用标题时感到困惑,而且并不总是正确的。
如果你得到它的原型,它应该是 yield Object.prototype
,当你得到MyConstructor
函数本身的原型时,它应该是Function.prototype
。请注意,您可以MyConstructor.constructor.prototype
再次执行后者……</p>