【问题标题】:Checking instanceof for objects declared differently检查 instanceof 是否有不同声明的对象
【发布时间】:2018-02-22 18:16:46
【问题描述】:

我正在阅读如何在 JavaScript 中声明对象。

有对象字面量方式和基于函数的方式。在下面的代码中,我使用对象字面量创建了一个名为 Person1 的对象,并使用基于函数的 Person2 创建了一个对象。

然后我尝试检查他们的实例。对于 Person2,我得到“true”,但对于 Person1,我得到“TypeError:'instanceof' 的右侧不可调用”

var Person1 = {
  name: "John"
}

function Person2() {
  this.name = "Jane";
}

var bob = Person1;
var bobby = new Person2();
console.log(bob instanceof Person1);
console.log(bobby instanceof Person2);

如何使用对象字面量创建对象并仍然获得正确的 instanceof?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    可以这样做,但你真的不应该Symbol.hasInstance 允许你重载instanceof 的行为:

    var Person1 = {
      name: "John",
      [Symbol.hasInstance](instance) {
        return instance === this;
      }
    }
    
    function Person2() {
      this.name = "Jane";
    }
    
    var bob = Person1;
    var bobby = new Person2();
    console.log(bob instanceof Person1);
    console.log(bobby instanceof Person2);

    然而,你应该做的是:

    function Person(name) {
      this.name = name;
    }
    
    // confusing variable names if you ask me
    var bob = new Person('John');
    var bobby = new Person('Jane');
    
    console.log(bob instanceof Person);
    console.log(bobby instanceof Person);

    【讨论】:

    • 有道理。让我感到困惑的是,我可以使用两种不同的东西创建对象,但其中只有一个是它的实际实例。
    • 令我困惑的是,您期望使用两种不同方法创建的对象是同一事物的实例...
    • 两个不同的东西应该是不同的
    【解决方案2】:

    Person1 引用 {name: "John"} object 而不是 constructor 所以你不能在 Person1 上做 instanceof

    虽然Person2constructor,所以您可以在Person2 上执行instanceof

    var Person1 = {
    	name: "John"
    }
    
    function Person2() {
    	this.name = "Jane";
    }
    var bob = Person1;
    var bobby = new Person2("john");
        
    console.log(bob === Person1) //true
    console.log(bob instanceof Object) //true
    console.log(bobby instanceof Person2) //true
    console.log(bobby instanceof Object) //true
    console.log(bobby === Person2) //false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多