Зачем мне нужен .prototype в superClass.prototype, когда он расширяется? - PullRequest
0 голосов
/ 25 мая 2018

Почему мне нужно использовать .prototype в Shape.prototype при его расширении?

// Shape — superClass
function Shape() {
  this.x = 0;
  this.y = 0;
  }

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Figure has rode out somewhere.');
};

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

Rectangle.prototype = Object.create(Shape.prototype);//<<<=HERE

Я имею в виду этот «Shape.prototype».Почему мне нужно использовать прототип, а не просто форму?Как я знаю .prototype содержит унаследованные свойства и методы класса.Мой класс Shape является базовым и не имеет унаследованных свойств.

1 Ответ

0 голосов
/ 25 мая 2018

Методы обычно добавляются к базовому прототипу объекта, чтобы их не нужно было хранить в каждом экземпляре, который создается позже.В данном примере это так, функция move() сохраняется в Shape.prototype.

Если вы не используете Shape.prototype с Object.create(), вы не получите методы, прикрепленные к этому объекту, унаследованному к Rectangle.

Технически,вы можете использовать только Object.create(Shape), но только в ситуациях, когда Shape имеет только свойства экземпляра, прикрепленные непосредственно к нему, и даже в этом случае это не будет очень масштабируемым решением, потому что, если вы когда-нибудь решите вернуться и добавить методык Shape.prototype в будущем ни один из ваших подтипов не унаследует его.

// Shape — superClass
function Shape() {
  this.x = 0;
  this.y = 0;
}

// Shape.prototype is a unique and specific instance of Object
// This particular instance is what Shape inherits from and is
// the reason why Shape will get a .toString() and a .valueOf()
// method.
console.log(Shape.prototype);

// This method is added to Shape.prototype. If you don't inherit
// from this, you won't inherit this method!!
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Figure has rode out somewhere.');
};

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

// If we don't inherit from Shape.prototype, we won't get
// any of the methods attached to it!
Rectangle.prototype = Object.create(Shape); 

var r = new Rectangle();

console.log(r.x, r.y);  // Works just fine for instance properties attached direclty to Shape
r.move(10,20);          // Fails because Shape.prototype wasn't used for inheritance!
...