话就不多了,直接上代码吧,里面有注释都写的很清楚了,欢迎拍砖.
好久没来了..顺便三点分.
- HTML code
<HTML> <HEAD> <TITLE> New Document </TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <SCRIPT LANGUAGE="JavaScript"> <!-- // ----------------工具类-------------------- var Class = { /** * 继承原型,参考自<javascript设计模式> * 子类方法中调用父类的方法: Man.superclass.sayName.call(this); */ extend:function(subClass,superClass){ var F = function(){}; F.prototype = superClass.prototype; subClass.prototype = new F(); // 避免父类的构造函数 subClass.prototype.constructor = subClass; subClass.superclass = superClass.prototype; if(superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } } Object.prototype.callSuper = function(superClass) { if(arguments.length == 0){ throw new Error('callSuper方法必须含有一个参数'); } var caller = arguments.callee.caller; // 子类引用 var subInstance = this; // 子类参数 var callerArgs = caller.arguments; var argsArr = []; for(var i=0,len=callerArgs.length; i<len; i++) { argsArr.push(callerArgs[i]); } superClass.apply(subInstance,argsArr); } // ------------------------------------ // Demo // 声明父类 var Person = function(param){ this.name = param.name; this.age = param.age; } Person.prototype.sayName = function(){ alert("My name is " + this.name); } Person.prototype.sayAge = function(){ alert("My age is " + this.age); } Person.prototype.getAge = function(){ return this.age; } // 声明子类 var Man = function(param){ // 调用父类的构造函数 this.callSuper(Person); } // 继承父类 Class.extend(Man,Person); // 覆盖父类的sayAge方法 Man.prototype.sayAge = function(){ alert(this.name + "'s age is " + this.age); } // 覆盖父类的方法,并且调用父类原来的方法 Man.prototype.getAge = function(){ // 先调用父类方法返回年龄 var age = Man.superclass.getAge.call(this); // 年龄+1 alert(this.name + "'s age is " + (age + 1)); } // 测试 var man = new Man({name:"Jim",age:22}); man.sayName(); // 这里调用父类的方法 man.sayAge(); // 这里调用自己的方法 man.getAge(); // //--> </SCRIPT> </HEAD> <BODY> </BODY> </HTML>
------解决方案--------------------
支持楼主,谢谢分享,先留言再收藏代码呀!!
------解决方案--------------------
记得 Caller 好像是一被删除的属性...对于 继承 这方面代码..已经很久没注意过了..一直用YUI3提供的几上函数处理 YUI.opp 模块提供有 extend augment...这二个楼主有兴趣可以看源代码
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
听说回复都可以得分?
------解决方案--------------------
接分 接分 等下再来研究代码
------解决方案--------------------
接分 接分 等下再来研究代码
------解决方案--------------------
谢谢楼主共享。