如何查看Javascript对象';s原型链?
给定以下代码:如何查看Javascript对象';s原型链?,javascript,prototype,prototypal-inheritance,Javascript,Prototype,Prototypal Inheritance,给定以下代码: function a() {} function b() {} b.prototype = new a(); var b1 = new b(); 我们可以保持a已添加到b的原型链中。伟大的而且,以下所有情况都是正确的: b1 instanceof b b1 instanceof a b1 instanceof Object 我的问题是,如果我们事先不知道b1的起源怎么办?我们如何发现其原型链的成员?理想情况下,我想要像[b,a,Object]或[“b”,“a”,“Object
function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();
我们可以保持a
已添加到b
的原型链中。伟大的而且,以下所有情况都是正确的:
b1 instanceof b
b1 instanceof a
b1 instanceof Object
我的问题是,如果我们事先不知道b1
的起源怎么办?我们如何发现其原型链的成员?理想情况下,我想要像[b,a,Object]
或[“b”,“a”,“Object”]
这样的数组
这可能吗?我相信我在某个地方看到过一个答案,描述了如何找到这个答案,但我一生都无法再找到它。编辑-这个答案是2010年的,非常过时。此后,该语言添加了Object.getPrototypeOf()
API,大大简化了过程
您可以使用对象的“构造函数”属性在那里找到原型,然后沿着原型链接,直到到达彩虹的尽头
function getPrototypes(o) {
return (function gp(o, protos) {
var c = o.constructor;
if (c.prototype) {
protos.push(c.prototype);
return gp(c.prototype, protos);
}
return protos;
})(o, []);
}
(可能)(也可能不是:-)给我一秒钟)(废话,我认为这是可能的,但忽略代码)
[编辑]哇,这真是让我大吃一惊-功能很接近,但不完全正确;建立一个原型链很奇怪,我感到害怕和孤独。我建议只关注上面的awesome@CMS。好吧,对象之间的原型链接(
[[prototype]]
)是内部的,一些实现,如Mozilla,将其公开为obj.\uuuuu proto\uuuu
ECMAScript第5版的方法正是您所需要的,但它目前尚未在大多数JavaScript引擎上实现
让我们看看John Resig的这一点,它有一个陷阱,它依赖于不支持\uuuu proto\uuu
的引擎的构造函数
属性:
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%可靠的,因为
构造函数
属性在任何对象上都是可变的。就像Javascript中的任何东西一样,查看对象属性并相信得到的结果是有风险的:-)谢谢,但这告诉我a
是b1
的原型,但与b
无关。我怎么才能发现b1
是b
的一个实例呢?退回到构造函数
不仅仅是因为潜在的原型篡改而错了,从一开始就完全错了,因为构造函数
没有做你认为会做的事情(见下面的评论)。这表明Resig对基本JavaScript功能的无知令人惊讶;不要使用此脚本。关于\uuu proto\uuu
和getPrototypeOf
的信息很好。那么,bobince,有解决方案吗?它是什么?constructor
为您提供最近的原型祖先的构造函数,该原型祖先没有从另一个构造函数原型继承。这几乎不是你想要的。例如,在问题的代码中,b1.constructor
是a
,而不是b
,如果您从b
派生出对象c
,则c1.constructor
仍然是a
。常规经验法则:永远不要使用构造函数。[ETA:LOL]‘害怕和孤独’……是的,这是JavaScript的一部分,它的目的是通过做一些看起来有用但实际上是陷阱的东西来迷惑你。]是的,我认为原来的问题是一个有趣的练习,但我从来没有把它放进我期望实际工作的代码中。这里有一个很好的解释: