代码如下:
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
哪位高手能帮忙解释一下?
构造函数应该是在真正被使用的时候被调用,而不是在继承的时候,假如每次继承都调用一次构造函数,而且构造函数有时并不像这里的例子这么简单,势必会影响到性能,从这个方面来解释的话,结论应该是在继承的时候,应该保证不调用基类的构造函数,我们会用一个空函数来替代之
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);
非常感谢你的解释
@菜鸟程序猿: 我只是举了个例子,实际情况可能需要写更好的代码,详细情况可以参考《JavaScript 设计模式》第四章关于继承的部分