Skip to main content
 首页 » 编程设计

javascript之如何查看 Javascript 对象的原型(prototype)链

2024年11月01日19mfryf

给定以下代码:

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属性在任何对象上都是可变的。