javascript 继承、命名空间实现分享
命名空间是用来组织和重用代码的编译单元,在大型项目开发中javascript使用的越来越多时,我们就应该将项目里的js类库管理起来,如何将自己进行归类管理,防止命名冲突,但是Javascript默认不提供这样的功能,看了这篇文章你就能解决这些问题了。
先说一下javascript命名空间的实现吧,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var Company = window.Company || {}; Company.namespace = function (ns) { if (!ns || !ns.length) { return null ; } var levels = ns.split( "." ); var nsobj = Company ; //如果申请的命名空间是在Company下的,则必须忽略它,否则就成了Company.Company 了 for ( var i = (levels[0] == "Company" ) ? 1 : 0; i < levels.length; ++i) { //如果当前命名空间下不存在,则新建一个关联数组。 nsobj[levels[i]] = nsobj[levels[i]] || {}; nsobj = nsobj[levels[i]]; } //返回所申请命名空间的一个引用; return nsobj; }; |
使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Company.namespace( "Company.AbcClass" ); /// <summary> /// XXXXX /// </summary> Company.AbcClass = function () { }; /// <summary> /// XXXXX /// </summary> HySoft.FormDesign.prototype = { abc: "" , abcFunction: function (){ } }; |
Javascript继承实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | ( function () { // 当前是否处于创建类的阶段 var initializing = false ; jsClass = function () { }; jsClass.extend = function (prop) { // 如果调用当前函数的对象(这里是函数)不是Class,则是父类 var baseClass = null ; if ( this !== jsClass) { baseClass = this ; } // 本次调用所创建的类(构造函数) function F() { // 如果当前处于实例化类的阶段,则调用init原型函数 if (!initializing) { // 如果父类存在,则实例对象的baseprototype指向父类的原型 // 这就提供了在实例对象中调用父类方法的途径 if (baseClass) { this ._superprototype = baseClass.prototype; } this .Init.apply( this , arguments); } } // 如果此类需要从其它类扩展 if (baseClass) { initializing = true ; F.prototype = new baseClass(); F.prototype.constructor = F; initializing = false ; } // 新创建的类自动附加extend函数 F.extend = arguments.callee; // 覆盖父类的同名函数 for ( var name in prop) { if (prop.hasOwnProperty(name)) { // 如果此类继承自父类baseClass并且父类原型中存在同名函数name if (baseClass && typeof (prop[name]) === "function" && typeof (F.prototype[name]) === "function" && /\b_super\b/.test(prop[name])) { // 重定义函数name - // 首先在函数上下文设置this._super指向父类原型中的同名函数 // 然后调用函数prop[name],返回函数结果 // 注意:这里的自执行函数创建了一个上下文,这个上下文返回另一个函数, // 此函数中可以应用此上下文中的变量,这就是闭包(Closure)。 // 这是JavaScript框架开发中常用的技巧。 F.prototype[name] = ( function (name, fn) { return function () { this ._super = baseClass.prototype[name]; return fn.apply( this , arguments); }; })(name, prop[name]); } else { F.prototype[name] = prop[name]; } } } return F; }; })(); |
使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var jsBasePage = jsClass.extend({ Init: function () { debugger; }, Load: function () { debugger; }, PreRender: function () { }, Ajax: function () { debugger; } }); var ABC = jsBasePage.extend({ Load: function () { debugger; this ._super(); } }); var abc = new ABC(); abc.Load(); |
代码比较简单,就不做解释了,实现原理和部分代码也是从网上借鉴的(原始地址已经找不到了)。
分类:
JQuery
标签:
Javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库