日期:2014-05-16 浏览次数:20326 次
<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>