JS中实现实现继承的机制不止一种,这是因为JS中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,我们有权决定最适用的继承方式。
1.构造继承法。
构造继承法是使用了FUNCTION对象的call和apply方法。call的第一个参数用作this的对象,其余的参数是传给函数的参数。示例代码如下
function classA(sColor)
{
this.color=sColor;
this.sayColor=function()
{
alert(this.color);
}
}
function classB(sColor,sName)
{
classA.call(this,sColor);
this.name=sName;
this.sayName=function()
{
alert(this.name);
}
}
这样,classB内部先调用了classA的构造函数,将该构造函数的的啊用对象设置成classB的对象,从而实现了对classA的继承.而apply的用法基本上和call相同,唯一的不同点是apply方法只有两个参数,第一个参数是用作this的对象,第二个参数是要传给构造函数的参数数组。要注意,用prototype对象定义的属性和方法是不能用这种方法继承的。
2.原型链
我们知道,prototype对象是个模版,要实例化的对象都会以这模板作为基础。总而言之,prototype对象的任何属性和方法都被传递给那个类的所有实例。原型链正是利用这种功能来实现继承机制。
function classA()
{
}
classA.prototype.color=”red”;
classA.prototype.sayColor=function()
{
alert(this.color);
}
function ClassB()
{
}
ClassB.prototype=new ClassA();
ClassB.prototype.name=””;
ClassB.prototype.sayName=function()
{
alert(this.name);
}
因为任何一个类只能有一个原型对象,所以原型链的弊端是不支持多重继承。而且,原型链会用另一类型的对象重写类的prototype属性。
3.混合方式
这种方式的思想是使用构造继承法继承属性,而用原型链继承法继承方法
function ClassA(sColor)
{
this.color=sColo;
}
ClassA.prototype.sayColor=function()
{
alert(this.color);
}
function ClassB(sColor,sName)
{
ClassA.call(this,sColor);
this.name=sName;
}
ClassB.prototype=new ClassA();
ClassB.prototype.sayName=function()
{
alert(this.name);
}
最后要注意的是用动态原型方法实现继承是不行的。。因为它会先创造对象实例,然后修改原型。这样会使第一个被创造的对象实例无法看到这种改变。但是未来的对象实例可以反映出这种改变。