【问题标题】:What's thedifference between comparing object.constructor to its constructor and instanceof? [duplicate]将 object.constructor 与其构造函数和 instanceof 进行比较有什么区别? [复制]
【发布时间】:2018-12-19 19:43:50
【问题描述】:

假设我有一个 Dog 构造函数

function Dog(name) {
    this.name = name;
}

我有一个构造函数的实例

const myDog = new Dog('Charlie');

据我最近了解到,有两种方法可以检查 myDog 是否是 Dog 的实例:

1.

console.log(myDog instanceof Dog) //true

2.

console.log(myDog.constructor === Dog) //true

我的问题是,两者有什么区别,哪个更好,为什么?

提前致谢。

【问题讨论】:

    标签: javascript object constructor instance ecmascript-5


    【解决方案1】:

    区别很简单。查看MDN's documentation of instanceOf。如果您有一个Fido 实例,它是GreatDane 的一个实例,它是Dog 的一个实例,它是Object 的一个实例,则情况如下:

    Fido instanceof GreatDane // true
    Fido instanceof Dog // true
    Fido instanceof Object // true
    Fido.constructor === GreatDane // true
    

    但是,以下情况并非如此:

    Fido.constructor === Dog // false
    Fido.constructor === Object // false
    

    因此您可以看到 instanceOf 关键字沿谱系传播,constructor 正在查看创建您的实例的实际函数。

    两者都不是更好。这取决于你的情况。您想了解每个对象的哪些信息?

    正如 Patrick Roberts 在下面的评论中指出的那样,Fido.constructor 将是继承自 GreatDane 的实际构造函数。而且你可以修改它,所以如果你改变了构造函数,你的比较就会返回false

    【讨论】:

    • 这不是常见的情况,但constructor 检查的一个缺点是constructor 是一个可写属性,因此在任何时候都可以重新分配给与不相关的任意值对象的实际构造函数。
    猜你喜欢
    • 2013-08-06
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多