使用Object.create()

时间:2018-04-16 05:10:51

标签: javascript object inheritance

我正在浏览有关MDN的主题。我走了一半,我无法完全掌握正在发生的事情。我希望能够阅读此代码,但我被卡住了。任何帮助或意见将不胜感激。

Classical inheritance with Object.create()

  • 第一个函数Shape()很简单。它是一个构造函数。
  • 下一节也很简单。 Shape.prototype.move是添加到Shape原型的方法。
  • 下一个构造函数Rectangle()是我开始失去它的地方。我将Shape.call(this)翻译成Shape来调用this的对象。但是this指出了什么,为什么需要这条线?
  • 在下一节我可能会彻底迷失。 Rectangle.prototype = Object.create(Shape.prototype)这是否意味着使Rectangle原型成为Shape原型?
  • 我无法翻译的最后一项。 Rectangle.prototype.constructor = Rectangle。实际发生了什么?



// 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();

console.log('Is rect an instance of Rectangle?',
  rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
  rect instanceof Shape); // true
rect.move(1, 1); // Outputs, 'Shape moved.'




1 个答案:

答案 0 :(得分:2)

this是Rectangle构造函数中新创建的Rectangle实例。

  Shape.call(this);

将调用Shape构造函数,this为新的Rectangle。需要这条线,以便......

  this.x = 0;
  this.y = 0;

...在Rectangle上执行。

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

这里定义了所有Rectangle从中扩展的Rectangles原型继承自Shapes原型。因此,所有Rectangles也都获得了Shapes方法。

  Rectangle.prototype.constructor = Rectangle

这只是确保.constructor()在Rectangles上执行的工作:

  const rect = new Rectangle();
  const rect2 = new rect.constructor();