// 在子类型构造函数的内部调用超类型的构造函数
// 别忘了,函数只不过是在特定环境中执行代码的对象,因此,通过使用call()和apply()也可以在新创建的对象上执行构造函数
function SuperType(){
this.colors=["red","blue","green"];
}
function SubType(){
// 继承了SuperType
SuperType.call(this); //借调了超类型的构造函数
}
var instance1=new SubType();
instance1.colors.push("yellow");
console.log(instance1.colors);
var instance2=new SubType(); // ["red", "blue", "green", "yellow"]
console.log(instance2.colors);// ["red", "blue", "green"]
// 通过使用call()或apply(),实际上是在新创建的SubType实例的环境下调用了SuperType构造函数,这样一来,就会在,新SubType对象上执行
SuperType()函数中定义的所有对象初始化代码。结果,SubType的所有实例都会有自己的colors属性。
1.传递参数
// 相对于原型链而言,借用构造函数有很大的优势,即可以在子类型构造函数中向超类型构造函数传递参数
// 看下面的例子
function SuperType(name){
this.name=name;
}
function SubType(){
// 继承了SuperType,同时还传递了参数
SuperType.call(this,"summer");
// 实例属性
this.age=20;
}
var instance1=new SubType();
console.log(instance1.name); // summer
console.log(instance1.age); // 20
// 在SubType构造函数内部调用SuperType构造函数时,实际上是为SubType的实例设置了name属性。
// 为了确保SuperType构造函数不会重写子类型的属性,可以在调用超类型构造函数后,再添加子类型独有的属性。
2 、借用构造函数的问题
// 如果仅仅是调用构造函数,那么也无法避免构造函数存在额问题,---方法都在构造函数中定义,因此函数复用就无从谈起了。
// 而且,在超类型的原型中定义的方法,对子类型而言是不可见的,结果,所有类型都只能使用构造函数模式,考虑到这些问题,
// 借用构造函数的技术也是很少单独使用的。