将 object.constructor 与其构造函数和 instanceof 进行比较有啥区别? [复制]

Posted

技术标签:

【中文标题】将 object.constructor 与其构造函数和 instanceof 进行比较有啥区别? [复制]【英文标题】: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

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

提前致谢。

【问题讨论】:

【参考方案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 是一个可写属性,因此在任何时候都可以重新分配给与不相关的任意值对象的实际构造函数。

以上是关于将 object.constructor 与其构造函数和 instanceof 进行比较有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

object constructor

详解Object.constructor

object.constructor (Object) – JavaScript 中文开发手册

关于 construct object opp

在 PHP 的未来版本中,与其类同名的方法将不再是构造函数; mPDF 有一个不推荐使用的构造函数

对原型链的理解