关于构造函数继承的缺点的一个疑问

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"];

书上说这个构造函数继承有一个缺点是:方法都在构造函数中定义,无法复用,不太理解什么叫无法复用,求解惑。

阅读 2.9k
1 个回答

书中这句话和这段代码其实没什么关系,代码是演示通过Super.call()借用构造函数继承的方法;

这句话要结合上一节的创建对象——构造函数模式来看,假设SuperType 在构造函数里定义了一个方法:

function  SuperType(name){
    this.colors=["red","blue","green"];
    this.name=name;
    this.sayName = function() {
        console.log(this.name);
    };
}

那么每一次调用new SuperType,就会在实例内部定义一次这个方法——你定义1000个实例,就会定义1000次这个方法;对于color 和name 这两个变量来说,这无可厚非;但实例方法大多数是相同的,所以这里更推荐把方法定义在SuperType.prototype上,这样每个实例构造出来就自动继承这个方法,不用在构造函数里一次次地写。

同理,假如你把方法定义在SuperType构造函数里(如上),那么借用SuperType 继承的时候:

function SubType(name){
    SuperType.call(this,name);
}

其实等价于:

function SubType(name) {
    this.colors=["red","blue","green"];
    this.name=name;
    this.sayName = function() {
        console.log(this.name);
    };
}

这不也会把SuperType函数里这个sayName方法一次次重复定义吗?

那么如果方法定义在SuperType.prototype 里,SubType怎么继承呢?你继续看书吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏