给定以下代码:
function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();
我们可以留下来
a
已添加到
b
的原型(prototype)链。伟大的。并且,以下所有内容都是正确的:
b1 instanceof b
b1 instanceof a
b1 instanceof Object
我的问题是,如果我们不知道
b1
的起源怎么办?提前时间?我们如何发现其原型(prototype)链的成员?理想情况下,我想要一个像
[b, a, Object]
这样的数组或
["b", "a", "Object"]
.
这可能吗?我相信我已经在 SO 的某个地方看到了一个答案,该答案描述了如何找出这一点,但我终生无法再次找到它。
请您参考如下方法:
好吧,对象之间的原型(prototype)链接( [[Prototype]]
)是内部的,一些实现,如 Mozilla,将其公开为 obj.__proto__
.
Object.getPrototypeOf
ECMAScript 5th Edition 的方法是您所需要的,但目前大多数 JavaScript 引擎都没有实现它。
看看这个implementation由 John Resig 撰写,它有一个陷阱,它依赖于 constructor
不支持 __proto__
的引擎的属性:
if ( typeof Object.getPrototypeOf !== "function" ) {
if ( typeof "test".__proto__ === "object" ) {
Object.getPrototypeOf = function(object){
return object.__proto__;
};
} else {
Object.getPrototypeOf = function(object){
// May break if the constructor has been tampered with
return object.constructor.prototype;
};
}
}
请记住,这不是 100% 可靠的,因为
constructor
属性在任何对象上都是可变的。