将object.constructor与其构造函数和instanceof进行比较之间的差异是什么?

Tal*_*tov 6 javascript constructor object instance ecmascript-5

可以说我有一个Dog构造函数

function Dog(name) {
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

我有一个构造函数的实例

const myDog = new Dog('Charlie');
Run Code Online (Sandbox Code Playgroud)

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

1.

console.log(myDog instanceof Dog) //true
Run Code Online (Sandbox Code Playgroud)

2.

console.log(myDog.constructor === Dog) //true
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

mcc*_*dge 2

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

Fido instanceof GreatDane // true
Fido instanceof Dog // true
Fido instanceof Object // true
Fido.constructor === GreatDane // true
Run Code Online (Sandbox Code Playgroud)

然而,以下情况将不成立:

Fido.constructor === Dog // false
Fido.constructor === Object // false
Run Code Online (Sandbox Code Playgroud)

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

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

正如帕特里克·罗伯茨在下面的评论中指出的那样,Fido.constructor实际的构造函数将继承自GreatDane. 并且您可以修改它,因此如果您更改了构造函数,您的比较将返回false.