使用Object.create进行继承?

时间:2015-01-22 00:36:12

标签: javascript inheritance prototype prototypal-inheritance

此代码来自Object.create()上的MDN文章:

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

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

// Rectangle - subclass
function Rectangle() {
  Shape.call(this); // call super constructor.
}

// subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

var rect = new Rectangle();

第三行到最后一行是我感到困惑的行。

之间有什么区别:

一个。现在怎么样。
B. Rectangle.prototype = Object.create(Shape);
C. Rectangle.prototype = new Shape();

不是所有3个最终都会产生相同的结果吗?在rect上定义了相同的属性,并使用相同的内存来定义它们?

,我已阅读其他有关Object.create()的StackOverflow问题。 没有,他们没有完全解决我的困惑。

1 个答案:

答案 0 :(得分:3)

  • Object.create(Shape)返回一个继承自Shape

    的对象

    如果你想创建Shape的子类,你可能不想这样做。

  • Object.create(Shape.prototype)返回一个继承自Shape.prototype

    的对象

    因此,此对象不具有xy自己的属性。

  • new Shape()执行此操作:

    1. 创建一个继承自Shape.prototype
    2. 的对象
    3. 调用Shape,将上一个对象传递为this
    4. 返回该对象(假设Shape未返回另一个对象)。
    5. 因此,此对象将拥有xy自己的属性。