浅析JavaScript继承方式

      前段时间温故了下JavaScript 的写类方式,从这篇开始我们看看JavaScript 的继承方式。

      面向对象的语言多数都支持继承,继承最重要的优点就是代码复用,从而构建大型软件系统。如果一个类能够重用另一个类的属性和或方法,就称之为继承。从这个角度来看看JS的继承方式。JS中继承方式与写类方式息息相关。不同的写类方式造成不同的继承方式。各种流行JavaScript库继承方式也各不相同。从最简单的复用开始。

      1、构造函数方式写类,通过方法调用复制父类属性/字段到子类 实现继承

      这里父类,子类都采用构造函数方式写,不用原型。子类调用父类函数来复制父类的属性。

 

       因为 JavaScript中具名函数的多种调用方式 ,子类还可以有以下的多种实现方式。只是在子类中调用父类方法不同而已。

      这种方式的缺点是子类的实例对象用instanceof检查父类时总是false。这与java中继承"is a "的关系是违背的。

      2、原型方式写类,原型方式继承

      core JS自身的对象系统就是采用原型方式(prototype based)继承的。或者说core JS没有采用常见的类继承(class based)系统,而是使用原型继承来实现自己的对象系统。工作中我们也可以用原型方式来实现继承,代码复用以构建自己的功能模块。

      虽然从输出可以看出子类继承了父类Polygon的属性sides和方法setSides,但sides是0,怎么会是三角形呢。还得调用下tri.setSides(3)使之成为三角形。这样似乎很不方便。不能传参数,即是原型方式的缺点。优点是正确的维护了"is a"的关系。

      3、组合构造函数/原型方式写类,采用前面种方式继承

      这种方式父类,子类的属性都挂在构造函数里,方法都挂在原型上。

      这篇开始写几个工具函数实现类的扩展。每个工具函数都是针对特定的写类方式(习惯)。这篇按照构造函数方式写类:属性(字段)和方法都挂在this上。以下分别提供了个类,分别作为父类和子类。

      继承工具函数一

      使用如下

     输出可以看到Man继承了Person的属性及所有方法。这种继承方式于java的很不一样哦,

      Java中,子类Person在自身构造方法中调用父类构造方法super(legs),创建对象的时候直接将父类构造参数legs:2传进去,不仅仅只传自己的name:jack。上面JavaScript继承是在extend时传父类构造参数(extend函数的第三个参数),而不是在new Man时将父类构造参数传过去。好,模拟Java来实现下extend,这里巧妙的在子类上暂存了父类引用。

      继承工具函数二

       还是以Person为父类,来实现子类Woman

       最后,创建对象的方式和java也类似,即new的时候同时将父类构造参数(nationality:Japan)传进去。

      继承工具函数三

      继承工具函数四

      这种方式是目前比较流行的,51ditu网站的开发就是按照这种模式的。

      继承工具函数五

从输出看可以看到子类Man的确继承了父类的属性和方法。

原文链接:http://www.cnblogs.com/snandy/archive/2011/03/09/1977804.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值