Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.create和prototype链的等效实例_Javascript_Instanceof_Object Create - Fatal编程技术网

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