- 浏览: 76444 次
- 性别:
- 来自: 广州
文章分类
最新评论
JavaScript 的命名空间并不是真正的命名空间, 只是在脚本内部创建一个封闭的小空间, 必须通过特定的空间名称才能对空间内部的代码进行访问, 这样可以防止同名函数和变量发生冲突, 也可以更方便地管理代码, 就像 .NET 的命名空间 (namespace) 和 Java 的包 (package) 一样.
为什么需要命名空间?
1. JavaScript 是不会禁止你重复定义函数和变量的, 但他只会使用最后定义的版本, 也就是说, 这将导致前面的失效, 令系统出错. 比如, $(id) 是最常用的, 也许你会毫不犹豫的在自己的脚本上定义这个函数, 但是当你用上 prototype, 你就会发现, 它和 prototype 的函数冲突, 并导致你的页面跑不动了. 怎么办? 这时候就需要命名空间了. 我发布的主题里面的 JavaScript 都有用命名空间包起来的, 我这么做就是为了防止和某些插件的代码发生冲突.
2. 如果你要为自己准备一套常用的函数, 或者自己搭建一个 framework, 那这个方法可以使你的代码维护起来更加方便.
怎么使用命名空间?
看以下代码, 命名空间里面定义了两个函数, 将空间命名为 myNamespace, 并声明了 $ 的对外接口. 也就是说, 我们可以在空间外部通过 myNamespace.$ 来调用 $ 函数, 但 myMethod 函数只能在空间内部使用. 因为外部调用需要通过空间来调用, 所以不会和外部函数发生冲突. 变量同理.
在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、SUN等大佬,那恭喜你,呵呵@_@!
从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;-)
实现前提:与Delphi、C#等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了原型(prototype)模式。
实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象)。
实现非常简单,整个命名空间机制的实现不超过20行代码,分析如下:
上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:
为什么需要命名空间?
1. JavaScript 是不会禁止你重复定义函数和变量的, 但他只会使用最后定义的版本, 也就是说, 这将导致前面的失效, 令系统出错. 比如, $(id) 是最常用的, 也许你会毫不犹豫的在自己的脚本上定义这个函数, 但是当你用上 prototype, 你就会发现, 它和 prototype 的函数冲突, 并导致你的页面跑不动了. 怎么办? 这时候就需要命名空间了. 我发布的主题里面的 JavaScript 都有用命名空间包起来的, 我这么做就是为了防止和某些插件的代码发生冲突.
2. 如果你要为自己准备一套常用的函数, 或者自己搭建一个 framework, 那这个方法可以使你的代码维护起来更加方便.
怎么使用命名空间?
看以下代码, 命名空间里面定义了两个函数, 将空间命名为 myNamespace, 并声明了 $ 的对外接口. 也就是说, 我们可以在空间外部通过 myNamespace.$ 来调用 $ 函数, 但 myMethod 函数只能在空间内部使用. 因为外部调用需要通过空间来调用, 所以不会和外部函数发生冲突. 变量同理.
(function() { // 通过 ID 获取 Element 对象 function $(id) { return document.getElementById(id); } // 显示对应 ID 的对象的节点类型名字 function myMethod(id) { alert($(id).nodeName); } // 这是对外的接口 window['myNamespace']= {} window['myNameSpace']['$'] = $; })();
在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、SUN等大佬,那恭喜你,呵呵@_@!
从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;-)
实现前提:与Delphi、C#等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了原型(prototype)模式。
实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象)。
实现非常简单,整个命名空间机制的实现不超过20行代码,分析如下:
// 声明一个全局对象Namespace,用来注册命名空间 var Namespace = new Object(); // 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA" Namespace.register = function(fullNS) { // 将命名空间切成N部分, 比如Grandsoft、GEA等 var nsArray = fullNS.split('.'); var sEval = ""; var sNS = ""; for (var i = 0; i < nsArray.length; i++) { if (i != 0) sNS += "."; sNS += nsArray[i]; // 依次创建构造命名空间对象(假如不存在的话)的语句 // 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去 sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();" } if (sEval != "") eval(sEval); }
上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:
// 注册命名空间Grandsoft.GEA, Grandsoft.GCM Namespace.register("Grandsoft.GEA"); Namespace.register("Grandsoft.GCM"); // 在Grandsoft.GEA命名空间里面声明类Person Grandsoft.GEA.Person = function(name, age) { this.name = name; this.age = age; } // 给类Person添加一个公共方法show() Grandsoft.GEA.Person.prototype.show = function() { alert(this.name + " is " + this.age + " years old!"); } // 演示如何使用类Person var p = new Grandsoft.GEA.Person("yanglf", 25); p.show();
发表评论
-
理解javascript的caller,callee,call,apply概念
2010-12-20 17:19 579在提到上述的概念之前 ... -
JavaScript事件的理解
2010-12-20 17:01 647在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很 ... -
javascript事件机制
2010-12-20 16:28 1184转http://www.jb51.net/article/22 ... -
offsetLeft,Left,clientLeft的区别
2010-12-20 12:12 638假设 obj 为某个 HTML 控件。 obj.offs ... -
Jquery1.4.3源码分析(一)
2010-12-17 16:19 1054Jquery是站在开发者的角度去考虑问题,在使用Js的时候,大 ... -
JavaScript的5种调用函数的方法
2010-12-17 14:52 677转http://www.cnblogs.com/lhb25 ... -
nodeType属性
2010-12-16 09:30 723作 用 辨识节点的DOM 型态。 基本语法 numN ... -
JavaScript exec() 方法
2010-12-16 09:18 742转http://www.w3school.com.cn/js/ ... -
Javascript面向对象基础以及接口和继承类的实现
2010-12-15 17:38 640转http://developer.51cto.com/art ... -
window.showModalDialog弹出框
2010-12-15 16:08 660当我们在使用window.showModalDialog弹出框 ... -
javascript调用文件保存命令
2010-12-14 14:31 923使用javascript调用系统文件保存 if(confi ...
相关推荐
JavaScript中的命名空间模式是一种组织和管理代码的方式,它旨在解决全局变量污染和命名冲突的问题。在JavaScript这种没有原生命名空间支持的语言中,通过创建一个全局对象并将所有功能附加到这个对象下面,可以模拟...
总结来说,JavaScript命名空间的创建和管理对于项目开发来说至关重要。通过合理使用命名空间,可以有效地隔离不同的代码模块,避免全局变量带来的命名冲突,同时也使得代码更加模块化,更易于管理和维护。在实际应用...
JavaScript 命名空间是一种组织代码的策略,用于避免全局变量污染和冲突,尤其是在大型项目中,多个组件或模块共存时。JavaScript 本身并不直接支持命名空间的概念,但可以通过对象和闭包来模拟实现。以下是一些实现...
JavaScript 命名空间是一种组织和管理代码的方式,它的主要目的是提高代码的可维护性和重用性,防止在大型项目中因为全局变量和函数名称冲突...总的来说,掌握和运用JavaScript命名空间是提升代码质量的重要手段之一。
JavaScript 命名空间工具 特征 ns 提供了两个简单但有用的功能: 1. 使用自动嵌套初始化轻松命名空间: // Assigns the function to window.MyApp.Security.authenticate. // NOTE: window.MyApp may not be ...
命名空间.js 一个简单的 JavaScript 命名空间函数。背景为了将代码组织成逻辑组,Java 和 C# 等编程语言具有namespace的概念。 JavaScript 没有命名空间的概念——但可以创建类似的功能。 Namespace.js 就是这样做的...
总结一下,利用MS AJAX注册JavaScript命名空间并创建类,我们可以更好地组织和管理代码,避免命名冲突,并利用ASP.NET AJAX库提供的高级功能。通过上述步骤,我们创建了一个名为`Demo.Person`的类,它包含一些属性和...
以下是五种创建JavaScript命名空间的方法: 1. **通过函数(function)创建** 这种方法通常涉及定义一个函数,然后在函数内部声明变量和方法。例如: ```javascript var namespace = namespace || {}; namespace....
然而,JavaScript不同于其他编程语言,如Java或C#,它没有内置的命名空间概念,这使得在处理大型项目时可能会遇到命名冲突的问题。在Java或C#中,命名空间用于将代码组织到逻辑分组中,允许相同的名称在不同的命名...
namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
传统的JavaScript命名空间通常是通过创建一个全局对象,然后将所有相关的函数和变量作为该对象的属性来实现的。例如: ```javascript var MyNamespace = { func1: function() {}, func2: function() {}, var1: '...
命名空间 一个简单的 JavaScript 命名空间库。 Namespaced.declare('myApp.namespace'); myApp.namespace = 'it worked!'; // does not complain about namespace being undefined
JavaScript 命名空间实现方法 JavaScript 编程引入命名空间的方法是为了避免函数名相同的问题。在 JavaScript 中,没有命名空间的概念,需要使用对象来模拟命名空间。下面是一个基本的命名空间实现方法: 1. 定义...
以上就是实现JavaScript命名空间的一些基本方法和技巧。通过命名空间,可以更好地管理代码结构,使得项目更加清晰和易于维护。需要注意的是,命名空间的使用要保持适度,过度使用或不恰当的使用命名空间可能会导致...
6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery [jQuery][9] [jQuery架构设计与实现][10] [jQuery选择器库][11] [zepto][12] 1....
6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery [jQuery][9] [jQuery架构设计与实现][10] [jQuery选择器库][11] [zepto][12] 1....