为什么我的instanceof运算符不响应?

问题描述 投票:0回答:3

我正在尝试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做了什么导致这种行为?

javascript ecmascript-6 ecmascript-5 ecmascript-2017
3个回答
6
投票

首先,我建议查看有关新运算符的文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

具体来说,请注意

执行代码new Foo(...)时,会发生以下情况:

  1. 创建一个新对象,继承自Foo.prototype。
  2. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等同于新的Foo(),即如果没有指定参数列表,则不带参数调用Foo。
  3. 构造函数返回的对象将成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。 (通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)

通过显式返回f,您将覆盖正常的创建过程。当你使用instanceof时,你会问“是n和f的实例”。不是。是f。它本身并不是一个例子。

因为显然f是一个函数,并且n === f,当你试图确定它们是否是函数时,两者都将返回true。另外,在Javascript中,函数本身就是对象(就像数组一样),这就是new f() instanceof Object为真的原因。


3
投票

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


2
投票

通过返回f,你返回的函数,它不是f的实例,因为它缺少与new的调用。

function f() { return f; }
console.log(new f() === f);
© www.soinside.com 2019 - 2024. All rights reserved.