JS中继承机制的实现

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);

}

 

最后要注意的是用动态原型方法实现继承是不行的。。因为它会先创造对象实例,然后修改原型。这样会使第一个被创造的对象实例无法看到这种改变。但是未来的对象实例可以反映出这种改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值