将 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) – JavaScript 中文开发手册