既然解释器无法分辨重载方法,那就手动区分不同的方法: 复制代码 代码如下: var MyClass=function(){ var AddNum=function(a,b){ return a+b; } var AddString=function(a,b){ return "I am here"+a+b; } this.Add=function(a,b){ if(typeof(a)=="number") return AddNum(a,b); else return AddString(a,b); } } var MyObj = new MyClass(); var X = MyObj.Add(5,6); var Y = MyObj.Add("A","FFFFFF"); alert(X); //结果:11 alert(Y); //结果:I am hereAFFFFFF
虚方法: 复制代码 代码如下: function BaseClass(){ this.Hello=function(){ return this.Say(); } } function MyClassA(){ this.Say=function(){ return "Hello"; } } function MyClassB(){ this.Say=function(){ return "This is MyClassB"; } } MyClassA.prototype = new BaseClass(); MyClassB.prototype = new BaseClass(); var ObjA = new MyClassA(); var XX = ObjA.Hello(); alert(XX); //结果:Hello var ObjB = new MyClassB(); var YY = ObjB.Hello(); alert(YY); //结果:This is MyClassB
由于Javascript解释执行的特性,因此可以再基类中调用将要在派生类中定义的方法,那么这个基类方法就相当于虚方法,可以实现模拟多态! js的重载和重写(覆写): 重载的意思是,“同一个名字的函数(注意这里包括函数)或方法可以有多个实现,它们依靠参数的类型和(或)参数的个数来区分识别”。而重写(覆盖)的意思是,“子类中可以定义与父类中同名,并且参数类型和个数也相同的方法,这些方法的定义后,在子类的实例化对象中,父类中继承的这些同名方法将被隐藏”。重载的英文是overload,覆盖的英文是override。好了,概念介绍到这里,你猜到我要说什么了吗?嘿嘿,Code is cheap.看重载代码: 复制代码 代码如下: // 通过函数的arguments属性实现重载 function add() { var sum = 0 ; for ( var i = 0 ; i < arguments.length; i ++ ) { sum += arguments[i]; } return sum; } function test() { alert(add()); alert(add( 1 , 2 )); alert(add( 1 , 2 , 3 )); }
通过代码运行结果,这样就实现了任意多个参数加法函数的重载了。当然,你还可以在函数中通过 instanceof 或者 constructor 来判断每个参数的类型,来决定后面执行什么操作,实现更为复杂的函数或方法重载。总之,javascript 的重载,是在函数中由用户自己通过操作 arguments 这个属性来实现的。关于arguments的特性,前面我已经做了简单介绍,参考拙文:http://blog.csdn.net/zhanglingdll_39/archive/2009/08/20/4465670.aspx 。 下面重点理解js重写的实现: // 为类添加静态方法inherit表示继承于某类 Function.prototype.inherit = function (baseClass) { for ( var p in baseClass.prototype) { this .prototype[p] = baseClass.prototype[p]; } } // js实现重写 function parentClass() { // 父类 } parentClass.prototype.method = function () { alert( " parentClass method " ); } function subClass() { // 子类 } // 复制代码 代码如下: 下面这一句和subClass.prototype = new parentClass();等价 subClass.inherit(parentClass); // subClass.prototype.method = function() { // 子类重写了父类的方法 -- 去掉注释运行试试看 // alert("subClass method"); // } function test() { var obj = new subClass(); obj.method(); } 这样,子类中定义的method 就覆盖了从父类中继承来的method 方法了。这是你可能会问,如何在子类中调用父类的method方法呢?好的,看实现如下: // 为类添加静态方法inherit表示继承于某类 Function.prototype.inherit = function (baseClass) { for ( var p in baseClass.prototype) { this .prototype[p] = baseClass.prototype[p]; } } /* 参考文章:http://menjoy.javaeye.com/blog/127847 */ // js实现重写 function parentClass() { this .method = function () { alert( " parentClass method " ); } } function subClass() { var method = this .method; this .method = function () { method.call( this ); alert( " subClass method " ); } } subClass.prototype = new parentClass(); // subClass.inherit(parentClass); //这一句貌似和上一句subClass.prototype = new parentClass();等价,其实呢????(注释上一行,运行这一行看看) subClass.prototype.constructor = subClass; function test() { var obj = new subClass(); obj.method(); }