【问题标题】: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 做了什么导致这种行为?

【问题讨论】:

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


    【解决方案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(...) 被执行时,会发生以下事情:

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

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

        因为很明显f 是一个函数,而n === f,当您尝试确定它们是否是函数时,两者都会返回true。此外,在 Javascript 中,函数本身就是对象(就像数组一样),这就是为什么 new f() instanceof Object 是正确的。

        【讨论】:

          猜你喜欢
          • 2012-06-20
          • 2011-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多