在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数的技术(有时候也叫做伪构造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用父类型的构造函数。别忘了,函数只不过是在特定环境中执行代码的对象,因此通过使用 apply() 和 call() 方法也可以在(将来)新创建的对象上执行构造函数,如下所示:
function SuperColors() {
this.colors = ["red", "green", "blue"];
}
function SubColors() {
// 继承 SuperColors
SuperColors.call(this);
}
var instance1 = new SubColors();
instance1.colors.push("white");
console.log(instance1.colors);
var instance2 = new SubColors();
console.log(instance2.colors);
上面代码的输出结果如下:
![](https://img.haomeiwen.com/i4011078/9439b22caa3cd2e0.png)
- 传递参数
相对于原型链,借用构造函数有一个很大的优势,即可以在子类型构造函数中向父类构造函数传递参数:
function SuperColors(colorName) {
this.colors = ["red", "green", "blue", colorName];
}
function SubColors() {
// 继承 SuperColors
SuperColors.call(this, "black");
}
var instance1 = new SubColors();
instance1.colors.push("white");
console.log(instance1.colors);
var instance2 = new SubColors();
console.log(instance2.colors);
输出结果:
![](https://img.haomeiwen.com/i4011078/79a7fcf58f70feb8.png)
- 借用构造函数的问题
如果仅仅是借用构造函数,那么也将无法避免构造函数模式存在的问题 —— 方法都在构造函数中定义,因此函数复用就无从谈起了。而且,在父类型的原型中定义的方法,对子类型而言也是不可见的,结果所有类型都只能使用构造函数模式。因此,借用构造函数的技术也是很少单独使用的。
网友评论