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上找到了一个答案,描述了如何找到这个,但我不能再为我的生活找到它.
那么,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属性在任何对象上都是可变的.
编辑\xe2\x80\x94 这个答案来自 2010 年,并且已经过时了。从那时起,该语言添加了Object.getPrototypeOf()API,这极大地简化了该过程。
您可以使用对象的“构造函数”属性来查找那里的原型,然后沿着它链接,直到到达彩虹的尽头。
\n\nfunction 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}\nRun Code Online (Sandbox Code Playgroud)\n\n(也许)(或者也许不是:-)给我一点时间)(好吧废话;我认为这是可能的,但忽略该代码)
\n\n[编辑] 哇,这完全让我大吃一惊 - 该函数很接近,但不太正确;建立一系列原型很奇怪,我感到害怕和孤独。我建议只关注上面很棒的@CMS。
\n| 归档时间: |
|
| 查看次数: |
6042 次 |
| 最近记录: |