如何查看Javascript对象的原型链?

pr1*_*001 19 javascript prototype prototypal-inheritance

给出以下代码:

function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();
Run Code Online (Sandbox Code Playgroud)

我们可以留下a已被添加到b原型链中.大.并且,以下所有都是真的:

b1 instanceof b
b1 instanceof a
b1 instanceof Object
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我们不知道b1提前的起源怎么办?我们怎样才能发现其原型链的成员?理想情况下,我喜欢像[b, a, Object]或的数组["b", "a", "Object"].

这可能吗?我相信我已经在SO上找到了一个答案,描述了如何找到这个,但我不能再为我的生活找到它.

CMS*_*CMS 7

那么,objects([[Prototype]])之间的原型链接是内部的,一些实现,比如Mozilla,将它暴露为obj.__proto__.

Object.getPrototypeOfECMAScript第5版的方法是您所需要的,但它现在还没有在大多数JavaScript引擎上实现.

看看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;
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

请记住,这不是100%可靠,因为该constructor属性在任何对象上都是可变的.

  • 就像Javascript查看对象属性并相信你得到的东西有风险一样:-) (2认同)

Poi*_*nty 3

编辑\xe2\x80\x94 这个答案来自 2010 年,并且已经过时了。从那时起,该语言添加了Object.getPrototypeOf()API,这极大地简化了该过程。

\n\n
\n\n

您可以使用对象的“构造函数”属性来查找那里的原型,然后沿着它链接,直到到达彩虹的尽头。

\n\n
function getPrototypes(o) {\n  return (function gp(o, protos) {\n    var c = o.constructor;\n    if (c.prototype) {\n      protos.push(c.prototype);\n      return gp(c.prototype, protos);\n    }\n    return protos;\n  })(o, []);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(也许)(或者也许不是:-)给我一点时间)(好吧废话;我认为这是可能的,但忽略该代码)

\n\n

[编辑] 哇,这完全让我大吃一惊 - 该函数很接近,但不太正确;建立一系列原型很奇怪,我感到害怕和孤独。我建议只关注上面很棒的@CMS。

\n