Методы обычно добавляются к базовому прототипу объекта, чтобы их не нужно было хранить в каждом экземпляре, который создается позже.В данном примере это так, функция 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!