首页 新闻 搜索 专区 学院

在JS中用原型链实现继承的疑问?

1
悬赏园豆:20 [已解决问题] 解决于 2012-04-01 11:01

代码如下:

function ClassA(){
}

ClassA.prototype.color="red";
ClassA.prototype.sayColor=function(){
alert(this.color);
}

function ClassB(){
}

ClassB.prototype=new ClassA();

后面写着:注意,调用ClassA的构造函数时,没有给它传递参数,这在原型链中是标准做法,要确保函数没有任何参数

这里为什么要无参数呢,我这样写也是可以的啊:

function ClassA(sName){
this.name=sName
}

ClassA.prototype.color="red";
ClassA.prototype.sayColor=function(){
alert(this.color);
}

function ClassB(){
}

ClassB.prototype=new ClassA("test");

var objB=new ClassB();
objB.sayColor();// red
console.log(objB.name);//test

哪位高手能帮忙解释一下?

草根程序猿的主页 草根程序猿 | 初学一级 | 园豆:129
提问于:2012-04-01 07:42
< >
分享
最佳答案
0

构造函数应该是在真正被使用的时候被调用,而不是在继承的时候,假如每次继承都调用一次构造函数,而且构造函数有时并不像这里的例子这么简单,势必会影响到性能,从这个方面来解释的话,结论应该是在继承的时候,应该保证不调用基类的构造函数,我们会用一个空函数来替代之

function ClassA(name){
this.name = name;
}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function(){
return this.color;
};

function ClassB(name){
// 在 ClassB 被 new 的时候调用所有构造函数,并传递参数
ClassB.superClass.constructor.call(this,name);
}

function empty(){
}
// 将 ClassA 复制到 empty ;
empty.prototype = ClassA.prototype;
// 继承的时候,调用的是一个空构造函数
ClassB.prototype = new empty();
// 让子类有办法访问基类
ClassB.superClass = ClassA.prototype;
// 将 ClassB 构造的构造函数修正,因为在继承的时候被修改成  empty 了
ClassB.prototype.constructor = ClassB;

var objB = new ClassB("myName");
objB.sayColor();
console.log(objB.name);
收获园豆:20
JoJoZhou | 菜鸟二级 |园豆:233 | 2012-04-01 10:47

非常感谢你的解释

草根程序猿 | 园豆:129 (初学一级) | 2012-04-01 11:01

@菜鸟程序猿: 我只是举了个例子,实际情况可能需要写更好的代码,详细情况可以参考《JavaScript 设计模式》第四章关于继承的部分

JoJoZhou | 园豆:233 (菜鸟二级) | 2012-04-01 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册