使用MDN文章了解Object.create()

时间:2018-04-30 04:27:03

标签: javascript

我从Object.create()上的MDN文章中获取了以下代码,以了解相同的内容。

// Shape - superclass
function Shape() {
  this.x = 0;
  this.y = 0;
}

function Rectangle() {
  Shape.call(this);
}

Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log(rect.y);

我评论了以下两行,仍然按预期工作。那么Object.create()方法在这段代码中有什么意义呢?为什么在示例中演示了这种方法?

Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

2 个答案:

答案 0 :(得分:4)

此声明使Rectangle原型成为继承自Shape原型的新对象。由于rect继承自Rectangle的原型(因为它是使用new Rectangle()构建的),这意味着rect间接从Shape&#继承39; s原型。

但是,你问题中的代码实际上没有为Shape的原型分配任何东西,所以它会运行得很好而不会这样做,使代码有点......愚蠢。它演示了该技术而没有证明该技术的目的。 1

将此添加到示例中会改变:

Shape.prototype.getPosition = function getPosition() {
    return [this.x, this.y];
};

然后,rect.getPosition()会返回[0, 0],因为rect继承了Rectangle原型的方法,后者又从{{1}继承了它原型。

1 正如评论中所指出的,您的问题中的代码省略了原始代码示例的一部分,这些部分确实说明了为什么您将从另一个继承一个原型对象。删除部分样本可能会使样本无效,这似乎就是这里发生的事情。

答案 1 :(得分:0)

事实上在这个MDN示例中,Rectangle的原型是一个继承自Shape原型的新对象。

仅仅因为rect原型Rectangle的继承而实际rect继承自Shape的原型。

任何事情都没有分配给Shape的原型,所以它运行并且什么也不做。

举例说明Shape原型内的方法:

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Shape moved.');
};

然后,rect.move(newX, newY)将返回一些内容。