在继承的关系中,有时候我们会通过调用父类的方法来避免编写重复的代码,这个时候,需要使用到 call
或 apply
方法来改变运行时的 this
定义父类
function Rectangle(length, width) {
this.length = length;
this.width = width;
}
// 加上实例方法
Rectangle.prototype.getArea = function() {
return this.length * this.width;
};
Rectangle.prototype.toString = function() {
return `[Rectangle ${this.length} x ${this.width}]`;
};
定义子类
function Square(size) {
Rectangle.call(this, size, size); // this 为 Square
// do other initialization things...
}
// 修改原型对象
Square.prototype = Object.create(Rectangle.prototype, {
constructor: {
configurable: true,
enumerable: true,
value: Square, // 修改构造方法
writable: true,
},
});
Square.prototype.toString = function() {
return `[Square ${this.length} x ${this.width}]`;
};
以调用父类的 toString()
方法为例
定义父类
function Rectangle(length, width) {
this.length = length;
this.width = width;
}
// 加上实例方法
Rectangle.prototype.getArea = function() {
return this.length * this.width;
};
Rectangle.prototype.toString = function() {
return `[Rectangle ${this.length} x ${this.width}]`;
};
定义子类
function Square(size) {
Rectangle.call(this, size, size); // this 为 Square
// do other initialization things...
}
// 修改原型对象
Square.prototype = Object.create(Rectangle.prototype, {
constructor: {
configurable: true,
enumerable: true,
value: Square, // 修改构造方法
writable: true,
},
});
Square.prototype.toString = function() {
const text = Rectangle.prototype.toString.call(this);
return text.replace('Rectangle', 'Square');
};
call
或 apply
来修改运行时的 this
super