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. 盗用构造函数的问题
这个问题显而易见
- 也是必须再构造函数中定义方法,因此函数不能重用
- 子类也不能访问父类原型上定义得方法,因此所有类型只能使用构造函数模式
由于存在这些问题,盗用函数也不能单独使用,
可以看看 继承之组合继承 这篇文章