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

时间:2018-09-01 20:58:50

标签: javascript ecmascript-6 ecmascript-5 ecmascript-2017

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

3 个答案:

答案 0 :(得分:6)

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

请特别注意

  

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

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

通过显式返回f,您将覆盖正常的创建过程。使用instanceof时,您要问“是n和f的实例”。不是。 。它不是自身的实例。

由于显然f是一个函数,而n === f则在您尝试确定它们是否是函数时都将返回true。另外,在Javascript中,函数本身就是对象(与数组一样),这就是new f() instanceof Object为真的原因。

答案 1 :(得分:3)

您正在从构造函数中返回ff 的构造函数。因此,您的构造函数永远不会构造实例,而您只是始终在测试构造函数是否为其自身的实例。根据定义,不是。

答案 2 :(得分:2)

通过返回f,您将返回该函数,该函数不是f的实例,因为它缺少对new的调用。

function f() { return f; }
console.log(new f() === f);