javascript继承的实现(二)
2009-02-17 12:14
204 查看
prototype继承是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。
只简单的这样设置继承的确如楼主所说,有不少缺点。总的来说有四个缺点:
缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。
缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于 JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有 什么影响。但是Array和Object类型就会有问题。
缺点三:如果父类的构造函数需要参数,我们就没有办法了。
缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。
我也曾经为了这四个缺点头疼过,于是对prototype继承进行改造。
我试了几种方法,下面是我觉得最好的一种。我把它写成Function对象的一个方法,这样用的时候方便。方法如下:
prototype.js 的实现:
转自:http://fastwind.javaeye.com/blog/200426
只简单的这样设置继承的确如楼主所说,有不少缺点。总的来说有四个缺点:
缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。
缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于 JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有 什么影响。但是Array和Object类型就会有问题。
缺点三:如果父类的构造函数需要参数,我们就没有办法了。
缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。
我也曾经为了这四个缺点头疼过,于是对prototype继承进行改造。
我试了几种方法,下面是我觉得最好的一种。我把它写成Function对象的一个方法,这样用的时候方便。方法如下:
//类的继承-海浪版 Function.prototype.Extends = function (parentClass) { var Bs = new Function(); Bs.prototype = parentClass.prototype; this.prototype = new Bs(); this.prototype.Super = parentClass; this.prototype.constructor = this; }
prototype.js 的实现:
Object.extend=function(destination,source){ for(property in source) { destination[property]=source[property]; } return destination; } Object.prototype.extend=function(object){ alert("Object.prototype.extend"); return Object.extend.apply(this,[this,object]); } function class1(){ } class1.prototype={ method:function(){ alert("class1.method!"); }, method2:function(){ alert("class1.method2!"); } }; function class2(){ } class2.prototype=(new class1()).extend( { method3:function(){ alert("class2.method!"); } } );
转自:http://fastwind.javaeye.com/blog/200426
相关文章推荐
- Javascript中类式继承和原型式继承的实现方法和区别之处
- Javascript 继承机制的实现
- javascript实现继承
- javascript中的继承的实现方式
- JavaScript实现继承的方式和各自的优缺点
- javascript 继承的实现
- JavaScript的9种继承实现方式归纳
- javascript 基于原型的知识--如何实现继承
- Javascript--原型链实现继承
- JavaScript 域名学习及对象的继承实现
- Javascript 实现方法继承
- [原]JavaScript必备知识系列-继承的实现方式
- javascript面向对象系列第三篇——实现继承的3种形式
- javaScript面向对象继承方法经典实现
- JavaScript继承实现方式一览
- JavaScript2种构造函数创建对象的模式以及继承的实现
- JavaScript面向对象-基于原型链和函数伪装组合的方式实现继承
- AJAX之旅(2):javascript中类的深入研究-实现和继承
- javascript继承(三)—继承的实现原理
- Javascript实现继承的6种方式