如何查看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的一部分,它的目的是通过做一些看起来有用但实际上是陷阱的东西来迷惑你。]是的,我认为原来的问题是一个有趣的练习,但我从来没有把它放进我期望实际工作的代码中。这里有一个很好的解释: