gpt4 book ai didi

javascript - instanceof 运算符在继承链的后续更改时返回 false

转载 作者:数据小太阳 更新时间:2023-10-29 06:12:22 24 4
gpt4 key购买 nike

当在构造函数上设置原型(prototype)时,instanceof 运算符仅返回 true,直到原型(prototype)被更改。为什么?

function SomeConstructorFunction() {
}

function extendAndInstantiate(constructorFn) {
constructorFn.prototype = {}; //Can be any prototype
return new constructorFn();
}

var child1 = extendAndInstantiate(SomeConstructorFunction);
console.log(child1 instanceof SomeConstructorFunction); //true

var child2 = extendAndInstantiate(SomeConstructorFunction);
console.log(child1 instanceof SomeConstructorFunction); //false
console.log(child2 instanceof SomeConstructorFunction); //true

最佳答案

原型(prototype)继承可能有点费脑筋。我已经在下面的答案中写了一个关于原型(prototype)继承的简单解释,我建议你阅读它:https://stackoverflow.com/a/8096017/783743

现在回答你的问题。考虑以下功能:

function F() {}

我可以使用 new 创建 F 的实例,如下所示:

var f = new F;

正如预期的那样,f instanceof F 返回 true。这是因为 instanceof 运算符检查 f 的原型(prototype)链中的 F.prototype 并返回 true 如果它有没有。请参阅我上面链接的答案。

现在假设我创建一个新函数 G 如下并将 F.prototype 设置为 G.prototype:

function G() {}

F.prototype = G.prototype;

如果我现在再次计算 f instanceof F false 返回。这是因为 F.prototype 不再在 f 的原型(prototype)链中(记住 F.prototype 现在是 G.prototype )。

现在让我们创建一个新的 F 实例:

var g = new F;

如果您计算 g instanceof G,它会返回 true,即使 g = new F。这是因为G.prototype存在于g的原型(prototype)链中。

这不是错误。这就是 JavaScript 的工作方式。事实上,我们可以利用这个特性来创建一些非常有趣的函数:Instantiate JavaScript functions with custom prototypes

关于javascript - instanceof 运算符在继承链的后续更改时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com