Javascript Object.create和prototype链的等效实例
考虑这样一个具有原型链的对象:Javascript Object.create和prototype链的等效实例,javascript,instanceof,object-create,Javascript,Instanceof,Object Create,考虑这样一个具有原型链的对象: var A = {}; var B = Object.create(A); var C = Object.create(B); 如何在运行时检查C的原型链中是否有A instanceof不适合,因为它是为与构造函数一起工作而设计的,我在这里不使用构造函数。您可以通过调用对象来迭代原型链。getPrototypeOf递归: 我的答案很简短 您可以使用isPrototypeOf方法,该方法将出现在您的对象从对象原型继承的情况下,如您的示例所示 例如: A.isPro
var A = {};
var B = Object.create(A);
var C = Object.create(B);
如何在运行时检查C的原型链中是否有A
instanceof
不适合,因为它是为与构造函数一起工作而设计的,我在这里不使用构造函数。您可以通过调用对象来迭代原型链。getPrototypeOf
递归:
我的答案很简短 您可以使用
isPrototypeOf
方法,该方法将出现在您的对象从对象原型继承的情况下,如您的示例所示
例如:
A.isPrototypeOf(C) // true
B.isPrototypeOf(C) // true
Array.prototype.isPrototypeOf(C) // false
更多信息可以在这里阅读:+1即将发布一个几乎相同的答案,即使是
do-while
,我并不经常看到。但是你的是一个更好的函数。@RightSaidFred:有趣的是,我还想到了一个事实,我使用了do
关键字,而我几乎从来没有这样做过。我很惊讶没有一个对象。ES6的hasPrototype
提案与你的函数完全一样。它似乎是对对象的自然补充。创建就像实例的是对新构造函数的。它甚至可以接受一个函数作为第二个参数,这将使用函数的原型作为目标。你能确认最近的EcmaScript没有为此添加内置功能吗?我记得这是存在的,但可能只是我的想象:-)@Kos:我不知道应该是哪个函数。MDN中列出的函数似乎都没有实现这一点:.+1简单解决方案。虽然您的示例完全正确,但检查C
是否为数组(我发现您的上一个示例有点含糊不清-在函数上使用isPrototypeOf
通常不是您想要的),应该是Array.prototype.isPrototypeOf(C)
),我不想浪费太多时间,因为当时已经给出了答案,所以我没有考虑太多的例子,我的目标只是展示可用的方法。。。尽管如此,我还是会用您的答案更正给出的示例,因为正如您所说,我也同意,我的最后一个示例是不明确的,谢谢通知=)只是一个简单的问题:对象如何可能不从对象继承?任何对象都有一个[[Prototype]]引用,通过原型链最终指向object.Prototype。@ViktorStolbin您可以使用var a=object.create(null)
以获取一个原型为null的对象。
A.isPrototypeOf(C) // true
B.isPrototypeOf(C) // true
Array.prototype.isPrototypeOf(C) // false