406 字
2 分钟
继承之盗用构造函数

盗用构造函数(对象伪装)#

为了解决原型中包含引用值的问题,引出盗用构造函数的一种方法

基本思路:在子类的构造函数中调用父类的构造函数,使用aplly()和call()方法以新创建的对象为上下文执行构造函数。

例如:

function SuperType(){
this.numbers = [1,2,3,4];
}
function SubType(){
SuperType.call(this);
}
let instance1 = new SubType();
instance1.numbers.push(5);
console.log(instance1.numbers); // [1,2,3,4,5]
let instance2 = new SubType();
console.log(instance2.numbers); // [1,2,3,4];

以上的盗用,即让SuperType构造函数在为SubType的实例创建的新对象的上下文中执行了。这就是相当于在新的SubType对象上运行了SuperType构造函数中的所有初始化代码。结果就是每一个实例都有自己的numbers属性

1. 传递参数#

相比于原型链的使用,盗用构造函数优点就是,可以在子类构造函数中向父类构造函数传参数。

function SuperType(name){
this.name = name;
}
function SubType(){
SuperType.call(this, 'weng');
this.age = 23;
}
let instance = new SubType();
console.log(instance.name); // weng

为了确保调用SuperType的时候覆盖了SubType自身定义的属性,最好先调用父函数之后再给子类添加额外属性

2. 盗用构造函数的问题#

这个问题显而易见

  1. 也是必须再构造函数中定义方法,因此函数不能重用
  2. 子类也不能访问父类原型上定义得方法,因此所有类型只能使用构造函数模式

由于存在这些问题,盗用函数也不能单独使用,

可以看看 继承之组合继承 这篇文章

继承之盗用构造函数
https://nollieleo.github.io/posts/继承之盗用构造函数/
作者
翁先森
发布于
2021-05-31
许可协议
CC BY-NC-SA 4.0