原型链的继承就是把父类的一个对象赋给子类的原型,这样就实现了子类对父类的继承。例子如下:
function Parent(){
this.pv="parent";
}
Parent.prototype.say=function(){
alert(this.pv);
}
function Son(){
this.sv="son";
}
Son.prototype=new Parent();
Son.prototype.ssay=function(){
alert(this.sv);
}
var s1=new Son();
alert(s1.pv);
s1.say();
从这里我们可以看出现在的子类已经可以调用父类的属性和方法。如果感觉父类的方法不能满足子类的使用的话,就可以把子类的方法名改成和父类的相同,这个叫做方法的覆盖也叫做重写,但是不是重载,javascript是弱数据语言类型,没有重载。
但是我们上面的写法也有一些缺陷就是无法在子类中调用父类的构造函数,这样也就无法把子类中的属性赋值给父类。所以我们便引入了基于伪装来实现继承。
function Parent(name){
this.name=name;
}
function Son(name,age){
this.age=age;
Parent.call(this,name);
}
var s1=new Son("父级元素",18);
alert(s1.name);
通过以上的方法我们可以发现通过call方法我们可以实现对父类的属性的修改。同样的,如果想修改很多的父级元素里面的属性的话还可以用apply,可以写成 Parent.apply(this,[name,age]) ,这样可以多个的修改父类的属性。
但是使用这样方法的话也是有缺陷的,就是子类的原型不会指向父类,所以父类中写在原型中的方法不会被子类继承,所以子类调用不到父类的方法。所以接下来就是终极方案,基于组合来进行继承。
function Parent(name){
this.name=name;
this.friends=['老王','老张']
}
Parent.prototype.say=function(){
alert(this.name+this.age+this.friends);
}
function Son(name,age){
this.age=age;
Parent.apply(this,[name,age]);
}
Son.prototype=new Parent();
Son.prototype.ssay=function(){
alert(this.name+this.age);
}
var s1=new Son("小石头",18);
s1.friends.push('老李');
s1.say();