function SuperType(name){
this.colors=["red","blue","green"];
this.name=name;
}
function SubType(name){
SuperType.call(this,name);//给SubType设置了name属性,并传递参数来初始化属性值
}
var x1=new SubType("cc");
var x2=new SubType();
alert(x1.name);//cc
x1.colors.push("black");
alert(x2.colors);//["red","blue","green"];
书上说这个构造函数继承有一个缺点是:方法都在构造函数中定义,无法复用,不太理解什么叫无法复用,求解惑。
书中这句话和这段代码其实没什么关系,代码是演示通过Super.call()借用构造函数继承的方法;
这句话要结合上一节的创建对象——构造函数模式来看,假设SuperType 在构造函数里定义了一个方法:
那么每一次调用new SuperType,就会在实例内部定义一次这个方法——你定义1000个实例,就会定义1000次这个方法;对于color 和name 这两个变量来说,这无可厚非;但实例方法大多数是相同的,所以这里更推荐把方法定义在SuperType.prototype上,这样每个实例构造出来就自动继承这个方法,不用在构造函数里一次次地写。
同理,假如你把方法定义在SuperType构造函数里(如上),那么借用SuperType 继承的时候:
其实等价于:
这不也会把SuperType函数里这个
sayName
方法一次次重复定义吗?那么如果方法定义在SuperType.prototype 里,SubType怎么继承呢?你继续看书吧。