官方demo The Object.create() method creates a new object with the specified prototype object and properties.
使用以下代码,为什么原型不等?
function Shape() {}
function Rectangle() {}
Rectangle.prototype = Object.create(Shape.prototype);
console.log(`${Shape.prototype === Rectangle.prototype}`) // false

为什么Shape.prototype === Rectangle.prototype
false
答案 0 :(得分:1)
在===
和Rectangle.prototype
等两个对象引用(名称)上使用Shape.prototype
时,您正在测试两个引用是否实际引用同一个对象。如果你有两个不同的对象碰巧在它们中包含相同的值,或者两个不同的对象,其中一个是另一个的原型,它们将不会相等。
致电Object.create()
creates a new object。它永远不会与任何其他对象相等。 Rectangle.prototype
是您刚刚创建的全新对象。它不是Shape.prototype
对同一对象的引用。 Rectangle.prototype
的原型是Shape.prototype
,但这并不会使它们成为同一个对象。所以他们会比较不平等。
通过对比,假设你已经这样做了:
Rectangle.prototype = Shape.prototype;
现在Rectangle.prototype
和Shape.prototype
都是对同一个对象的引用,因为这就是=
运算符的作用。与Object.create()
不同,=
运算符不会创建新对象,只会创建对同一对象的新引用。如果你然后使用===
来比较它们,它们将比较相等,因为这两个名字实际上是指同一个对象。
答案 1 :(得分:1)
来自MDN:
Object.create()方法使用指定的原型对象和属性创建一个新对象。
Rectangle.prototype
是一个原型为Shape.prototype
的对象。也就是Rectangle.prototype != Shape.prototype
。
另一方面:
function Shape() {}
function Rectangle() {}
Rectangle.prototype = Object.create(Shape.prototype)
// true
console.log(Object.getPrototypeOf(Rectangle.prototype) == Shape.prototype)

此外,您可以使用instanceof
来验证给定对象是某个原型的实例:
function Shape() {}
function Rectangle() {}
Rectangle.prototype = Object.create(Shape.prototype)
console.log(Rectangle.prototype instanceof Shape)

答案 2 :(得分:0)
这里有一个中间对象。 Object.create具有此签名
Object.create(proto)
其中proto
是应该是新创建对象原型的对象。
Rectangle.prototype
指的是原型设置为Shape.prototype
的对象。当你使用===
时,你比较他们的参考文献,这些参考文献是不同的,所以你为何会弄错。
查看可视化
------- -----
Rectangle.prototype -> | | | |
|proto| ------> -----
------- ^
|
Shape.prototype ----------------------------
答案 3 :(得分:0)
您无法使用===或==比较对象。您需要编写函数来检查每个属性以及检查对象相等性的属性数。你可以在这里阅读 -