为啥我的 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】:

您正在从构造函数返回ff 构造函数。所以你的构造函数从不构造实例,你只是一直在测试构造函数是否是它自己的实例。根据定义,它不是。

【讨论】:

【参考方案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?>?

为啥 spring 没有按要求发送 403 响应状态?

为啥我的微 API 没有响应体?

为啥我的获取帖子不起作用它没有响应?

为啥没有在 CORS 未命中时设置“Vary: Origin”响应?

为啥我的轮播滑块中的图像没有响应?