1.构造继承法
构造继承法是使用了function对象的call()和apply()方法
call的第一个参数用作this对象,其余参数是传给函数的参数.
function A(sName){
this.name = sName;
this.sayName = function(){
alert(this.name);
}
}
function B(sName,sAge){
A.call(this,sName);
this.age = sAge;
this.sayAge = function(){
alert(this.age);
}
}
这样,B内部调用了A的构造函数,从而实现了对A的继承,
apply用法基本与call相同,不同的是apply方法只有两个参数,第一个用作this对象,第二个参数是要传给构造函数的参数 数组.
!注 用prototype独享定义的属性和方法时不能用这种方法继承的.
2.原型链
prototype对象的任何属性和方法都被传递给那个类的所有实例.原型链正是利用这种功能来实现继承机制.
function A(){}
A.prototype.color = "pink";
A.prototype.sayColor = function(){
alert(this.color);
}
function B(){}
B.prototype = new A();
B.prototype.name = "";
B.prototype.sayName = function(){
alert(this.name);
}
因为任何一个类只能由一个原型对象,所以原型链弊端是不支持多重继承,而且,原型链会以另一类型的对象重写类的prototype属性.
3.混合模式
此方法思想是使用构造继承法继承属性,而用原型链继承法继承方法.
function A(sname){
this.name = sName;
}
A.prototype.sayName = function(){
alert(this.name);
}
function B(sName,sAge){
A.call(this,sName)
this.sge = sAge;
}
B.prototype = new A();
B.prototype.sayAge = function(){
alert(this.age);
}
!注 不能用动态原型方法实现继承,因为它会先创建对象实例,认购改变原型.这样会使第一个创建的对象实例无法看到这种改变,但之后的对象实例可以反映出这种改变.
原文来源于这里