我正在浏览有关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.'

答案 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();