>

JS常见创建类的方法小结_javascript技巧_脚本之家,

- 编辑:澳门新葡亰平台游戏 -

JS常见创建类的方法小结_javascript技巧_脚本之家,

复制代码 代码如下: /** * 定义包 * @param {} ns * @return {} */ Xu.pkg = function { if { return null; } var levels = ns.split; var nsobj = Xu; for (var i = ? 1 : 0; i < levels.length; ++i) { nsobj[levels[i]] = nsobj[levels[i]] || {}; nsobj = nsobj[levels[i]]; } return nsobj; }; 复制代码 代码如下: // ------------------- Xu.Core.Class命名空间 Xu.pkg; 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{ if (Core.Util.isFunction return true ; return false ; }; Core.Class.remove = function{ if (Core.Class.isExist Xu.pkg(Class.prototype.__pkg__)[Class.prototype.__class__] = null ; }; Core.Class.hasProperty = function{ if (Core.Class.isExist 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 === ""){ return null ; } isOverride = isOverride || false ; try { var $this_class = eval(packageName + "." +className); if (Core.Class.isExist { trace( "isExist: " + className + " Override:" + isOverride ); if { return null ; } } } catch{ //如果出异常,说明该类没有定义 } if (Core.Util.isNull || packageName === ""){ packageName = USER_DEF_CLASS_NS ; } $this_pkg = Xu.pkg; //定义父类,将子类的原型 指向父类 if (Core.Util.isNull || 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{ $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; // //var x_class = new Xu.Class.Sys.XClass(); //trace + 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_.version ); //traceobj('XClass_',XClass_.prototype); //// //var X_ = Core.Class.create(null,'X_',XClass_,null); //// //var x_ = new X_(); //trace + x_.version ); //traceobj; 测试使用的,呵呵 /... 作者:vb2005xu

本文实例讲述了JS常见创建类的方法。分享给大家供大家参考,具体如下:

Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程语言,因为它的语法中没有Class。(不过,ES6引入了Class这个概念,作为对象的模板。通过class关键字,可以定义类。ES6入门:

但是在项目开发中,经常用到JS面向对象开发,这就需要我们去用JS创建类,从而去实例化一些对象。接下来我们介绍一下在JS中创建类的几种方式:

1.工厂方式:

//通过工厂方式创建对象,先定义一个工厂方法function createObj(){ var obj = new Object(); obj.name="xxx"; obj.say=function; } return obj;}//调用工厂方法创建对象:var obj1 = createObj();//也可以用这种形式function createObj(){ var obj = {}; //这样生成对象 obj.name="xxx"; obj.say=function; } return obj;}var obj1 = createObj();

这种方式的问题是每一次通过工厂方法去创建一个对象,这个对象的属性name和方法say都必须重新创建一次,浪费内存。

2.构造器方式:

//创建一个构造器,构造函数首字母大写function Obj(){ this.name="xxx"; this.say=function; };}//利用构造器,通过new关键字生成对象var obj1=new Obj();

这是最基本的方式,但是也存在和工厂方式一样的毛病。

3.原型方式:

//用空函数创建一个类function Obj(){}//在类的原型链上添加属性和方法Obj.prototype.name="xxx";Obj.prototype.say=function;}//生成对象var obj1=new Obj();

这个方式的缺点是,当有引用属性时,改变一个对象的这个属性也会改变其他对象的这个属性。因为一个引用属性,都是指向的同一个地方。

4.原型/构造联合方式

//用构造函数定义对象的非函数属性function Obj{ this.name=name; this.arr=new Array;}//用原型方式定义对象的方法Obj.prototype.say=function;}//生成对象var obj1 = new Obj;

这种是目前用的最多的创建类和对象的方式,将方法和属性用不同的方式封装。

5.动态原型方式

//动态原型方式和原型/构造混合方式的原理相似,唯一的区别就是赋予对象方法的位置function Person { this.name = name; this.sex = sex; if (typeof this.say != "function") { Person.prototype.say = function ; } }}var man =new Person ;//凯撒

动态原型模式是将所有的信息都封装到构造函数中,构造函数中,只用say不存在的情况下,才会将它添加到原型中。这段代码只有在初次调用时才会执行。

实例化obj对象有三步:

  1. 创建obj对象:

    obj=new Object();

2. 将obj的内部__proto__指向构造他的函数Obj的prototype,同时,obj.constructor===Obj.prototype.constructor,从而使得obj.constructor.prototype指向Obj.prototype(obj.constructor.prototype===A.prototype)。obj.constructor.prototype与的内部_proto_是两码事,实例化对象时用的是_proto_,obj是没有prototype属性的,但是有内部的__proto__,通过__proto__来取得原型链上的原型属性和原型方法。

  1. 将obj作为this去调用构造函数Obj,从而设置成员并初始化。

当这3步完成,这个obj对象就与构造函数Obj再无联系,这个时候即使构造函数Obj再加任何成员,都不再影响已经实例化的obj对象了。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

本文由服务器发布,转载请注明来源:JS常见创建类的方法小结_javascript技巧_脚本之家,