该类库主要依赖John Resig大神的Simple JavaScript Inheritance ,并对其做了修改.修改后的代码如下:
var C = (function(){ // ------Class Creation------ var initializing = false, fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/: /.*/; // The base Class implementation (does nothing) this.Class = function() {}; // Create a new Class that inherits from this class Class.extend = function(prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this(); initializing = false; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) { return function() { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we're done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if (!initializing && this.init) this.init.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.prototype.constructor = Class; // And make this class extendable Class.extend = arguments.callee; // ------自定义方法------ /* 接口检查,参数可以是一个或多个,使用方法: * //声明接口 * var Interface1 = Class.createInterface(['getName']); * // Person类实现接口 * var Person = Class.extend({...}).impl(Interface1); */ Class.impl = function() { if (arguments.length > 0) { for (var i = 0, len = arguments.length; i < len; i++) { var interfac = arguments[i]; if (!interfac._isInterfaceType) { throw new Error("Class.impl()第" + (i + 1) + "个参数必须是接口类型"); } for (var j = 0, methodLen = interfac.methods.length; j < methodLen; j++) { var method = interfac.methods[j]; if (!prototype[method] || typeof prototype[method] !== "function") { throw new Error("类没有实现接口中的[" + method + "]方法"); } } } } return Class; };// ------自定义方法 end------ return Class; };// ------Class Creation end------ // 接口辅助类 var Interface = function(_methods) { if(typeof _methods.join !== "function") { throw new Error("参数" + _methods + "错误.创建接口参数只能有一个,并且为数组类型"); } this.methods = []; this._isInterfaceType = true; for (var i = 0, len = _methods.length; i < len; i++) { if (typeof _methods[i] !== "string") { throw new Error("定义接口中的方法必须为字符串类型"); } this.methods.push(_methods[i]); } }; return { /** * 创建一个类 * @param option 类方法,json数据 * @param parentClass 父类 */ createClass:function(option,parentClass) { if(!parentClass) { parentClass = Class; } return parentClass.extend(option); } /** * 创建一个接口 * @param methods 接口中的方法 */ ,createInterface:function(methods) { return new Interface(methods); } }; })();
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JS类的创建,继承,接口实现</title> <script type="text/javascript" src="../src/core/C.js"></script> <script type="text/javascript"> //------------------------- // JS类的创建,继承,接口实现 //------------------------- // 例子1:------------------------- // 创建一个类 var Person = C.createClass({ // 构造函数 init:function(option){ this.name = option.name; } ,sayName:function() { console.log(this.name); } ,getName:function() { return this.name; } }); // 声明类实例 var Jim = new Person({name:'Jim'}); Jim.sayName(); //例子2:------------------------- // 创建一个接口,接口里面有sayName方法 var Act = C.createInterface(['sayName']); // 创建一个类,继承Person类,并实现Act接口 var Man = C.createClass({ init:function(option) { this._super(option);// 调用父类构造函数 this.age = option.age; } ,sayAge:function() { console.log(this.age); } },Person).impl(Act); var man = new Man({name:'Tom',age:22}); man.sayName(); man.sayAge(); //例子3:------------------------- // 创建接口 var Smile = C.createInterface(['smile']); // 创建类,继承Person类,实现Act,Smile两个接口 var Woman = C.createClass({ init:function(option) { this._super(option); } // override ,smile:function() { console.log('hehe'); } // override,重写Person类的sayName方法 ,sayName:function() { console.log('My name is ' + this.getName()); } // override ,getName:function() { // 调用父类的getName() var name = this._super(); return '{'+name+'}'; } },Person).impl(Act,Smile); var woman = new Woman({name:'Lily'}); woman.smile(); woman.sayName(); console.log(Jim instanceof Person); console.log(man instanceof Person); console.log(woman instanceof Person); console.log(woman instanceof Woman); </script> </head> <body> </body> </html>由此可以见实现了类的创建,接口实现,继承,重写方法等基本功能.