上期我们介绍了下原型链,知道了它潜在的问题,我们这期运用借用构造函数来解决上期遗留问题。回顾以下:
上期遗留问题
- 包含引用类型的原型属性会被所有实例共享,因此,我们如果一个实例中修改了这个原型属性,那么,其他实例的对应属性也会改变
- 在创建子类型的实例时,不能向父类构造函数中传递参数。
我们是否可以在子类型构造函数的内部调用父类的构造函数?了解apply()、call()方法的应该知道,这两个方法可以在新创建的对象上执行构造函数。因此我们可以做如下处理:
function SuperType() {
this.colors = ['red', 'blue', 'green'];
}
function SubType() {
// 继承SuperType
SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push('black');
console.log(instance1.colors) // 'red', 'blue', 'green', 'black'
var instance2 = new SubType()
console.log(instance2.colors) // 'red', 'blue', 'green'
通过调用call() 方法,我们会在SubType的每个实例中都会创建一个colors的副本。
第一个问题解决了,那么我们考虑下第二个问题,我们知道call(),第一个参数为一个对象,第二个参数为给当前对象传参。那么我们是否可以考虑如下修改:
function SuperType(name) {
this.name = name;
}
function SubType() {
// 继承SuperType
SuperType.call(this, 'bill');
}
var instance = new SubType()
instance.name // bill
借用构造函数的问题
- 方法定义在构造函数中,方法无法复用
网友评论