|
JS OOP包机制,类创建的方法定义,需要的朋友可以参考下。
复制代码 代码如下: /** * 定义包 * @param {} ns * @return {} */ Xu.pkg = function(ns) { if (!ns || !ns.length) { return null; } var levels = ns.split("."); var nsobj = Xu; for (var i = (levels[0] == "Xu") ? 1 : 0; i < levels.length; ++i) { nsobj[levels[i]] = nsobj[levels[i]] || {}; nsobj = nsobj[levels[i]]; } return nsobj; };
复制代码 代码如下: // ------------------- Xu.Core.Class命名空间 Xu.pkg("Core.Class"); var SYS_DEF_CLASS_NS = 'Xu.Class.Sys' ; var USER_DEF_CLASS_NS = 'Xu.Class.Custom' ;
/** * 验证类是否存在 * @param {String} Class * @return {Boolean} */ Core.Class.isExist = function(Class){ if (Core.Util.isFunction(Class)) return true ; return false ; };
Core.Class.remove = function(Class){ if (Core.Class.isExist(Class)) Xu.pkg(Class.prototype.__pkg__)[Class.prototype.__class__] = null ; };
Core.Class.hasProperty = function(Class,property){ if (Core.Class.isExist(Class)) if ( Class[property] || Class.prototype[property]) return true ; return false ; };
/** * 模拟类的定义 , 支持包机制,继承和多态 * @param packageName {String} 包的名字 * @param className {String} 类的名字 * @param superClass {Class} 父类对象 * @param classImp {Object} 类的实现代码 * @param isOverride {Boolean} 是否覆盖,当类定义存在时,缺省不覆盖 * * @return {Function} */ Core.Class.create = function(packageName,className,superClass,classImp,isOverride){ if (Core.Util.isNull(className) || className === ""){ return null ; }
isOverride = isOverride || false ; try { var $this_class = eval(packageName + "." +className); if (Core.Class.isExist($this_class)) { trace( "isExist: " + className + " Override:" + isOverride ); if (!isOverride){ return null ; } } } catch(e){ //如果出异常,说明该类没有定义 }
if (Core.Util.isNull(packageName) || packageName === ""){ packageName = USER_DEF_CLASS_NS ; } $this_pkg = Xu.pkg(packageName); //定义父类,将子类的原型 指向父类 if (Core.Util.isNull(superClass) || superClass === ""){ // superClass = Object ; superClass = Xu.Class.Sys.XClass ; } //定义类 $this_class = $this_pkg[className] = function(){};
// 将子类的原型 指向父类,以此获取属性继承 $this_class.prototype = new superClass(); Object.extend($this_class.prototype , { '__pkg__': packageName , '__superclass__': $this_class.prototype['__class__'] || 'Object', '__class__': className , 'toString': function(){ return "[class: " + this.__pkg__ + "." + this.__class__ + "]" ; } } ); if (Core.Util.isObject(classImp)){ $this_class.prototype = Object.extend( $this_class.prototype,classImp); } return $this_class ; } ; //定义基类, 用于框架中所创建的类的基类. Core.Class.create(SYS_DEF_CLASS_NS,'XClass',Object,{ 'version': 'V0.1' });
// Xu.Core.Class 测试区域 //测试 类覆盖定义 ; //Core.Class.create(SYS_DEF_CLASS_NS,'XClass',Object,{ // 'version': 'V0.5' //},true); // //// 测试 类属性检查方法 ; //Xu.Class.Sys.XClass.ve = '2' ; //trace(Core.Class.hasProperty(Xu.Class.Sys.XClass,'ve')); // ////Core.Class.remove(Xu.Class.Sys.XClass); // //var x_class = new Xu.Class.Sys.XClass(); //trace(x_class.toString() + x_class.version ); //traceobj('XClass',Xu.Class.Sys.XClass.prototype); //// //var XClass_ = Core.Class.create(null,'XClass_',null,{h:'hello'}); //// //var x_class_ = new XClass_(); //trace(x_class_.toString() + x_class_.version ); //traceobj('XClass_',XClass_.prototype); //// //var X_ = Core.Class.create(null,'X_',XClass_,null); //// //var x_ = new X_(); //trace(x_.toString() + x_.version ); //traceobj('X_',X_.prototype); 测试使用的,呵呵 /... 作者:vb2005xu |
|