为什么原型与Object.create()不相等

时间:2018-01-30 09:46:00

标签: javascript prototype

官方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

4 个答案:

答案 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.prototypeShape.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)

您无法使用===或==比较对象。您需要编写函数来检查每个属性以及检查对象相等性的属性数。你可以在这里阅读 -

Object comparison in JavaScript