为啥我的 instanceof 运算符没有响应 true?
Posted
技术标签:
【中文标题】为啥我的 instanceof 运算符没有响应 true?【英文标题】:Why my instanceof operator doesn't respond true?为什么我的 instanceof 运算符没有响应 true? 【发布时间】:2019-02-07 11:17:41 【问题描述】:我正在尝试instanceof
运算符。我试过这样的东西。
function f() return f;
new f() instanceof f;
// false
为什么这是false
,而这些是true
function f() return f;
new f() instanceof Function;
// true
function f() return f;
new f() instanceof Object;
//true
当尝试将其保存到变量时,结果仍然相同
function f() return f;
var n = new f();
n instanceof f;
// false
n();
// function f()
n() instanceof f;
// false
n instanceof Function // true
n() instanceof Function // true
为什么return f;
声明改变了一切?
return f
做了什么导致这种行为?
【问题讨论】:
【参考方案1】:通过返回f
,您返回的函数不是f
的实例,因为它缺少与new
的调用。
function f() return f;
console.log(new f() === f);
【讨论】:
【参考方案2】:您正在从构造函数返回f
。 f
是构造函数。所以你的构造函数从不构造实例,你只是一直在测试构造函数是否是它自己的实例。根据定义,它不是。
【讨论】:
【参考方案3】:首先,我建议您查看有关新运算符的文章:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Operators/new
特别注意
当代码 new Foo(...) 被执行时,会发生以下事情:
创建了一个新对象,继承自 Foo.prototype。 使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。 new Foo 等价于 new Foo(),即如果没有指定参数列表,则调用 Foo 时不带参数。 构造函数返回的对象成为整个new表达式的结果。如果构造函数没有显式返回对象,则使用在步骤 1 中创建的对象。 (通常构造函数不返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)
通过显式返回f
,您将覆盖正常的创建过程。当您使用instanceof
时,您在问“是 n 和 f 的实例”。它不是。它是 f。它不是自身的一个实例。
因为很明显f
是一个函数,而n === f
,当您尝试确定它们是否是函数时,两者都会返回true。此外,在 Javascript 中,函数本身就是对象(就像数组一样),这就是为什么 new f() instanceof Object
是正确的。
【讨论】:
以上是关于为啥我的 instanceof 运算符没有响应 true?的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 <T> 到 <U> 的隐式转换运算符接受 <T?>?