- 浏览: 313672 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (286)
- 设计模式 (14)
- spring (5)
- 开发工具 (12)
- java (19)
- apache.commons工具 (7)
- ibaits (5)
- extjs4.0 (4)
- 数据库 (2)
- spring工具类 (2)
- jquery1.8 (32)
- 杂记 (1)
- linux (2)
- Quart (1)
- springMVC (2)
- webservice (1)
- oracle (5)
- dwr (6)
- jbmp3 (27)
- lucene3.5 (27)
- javascript (18)
- hibernate3.3.2 (27)
- spring事务管理 (10)
- nio (2)
- strust2 (3)
- jvm (7)
- jquery-easyui-1.2.6 (22)
- 多线程 (14)
- maven (3)
- 常用正则表达式 (4)
最新评论
-
HF_SKY000:
请问:
一、能否提供一下密钥库文件的生成方法?
二、密钥库的密 ...
Java sslSocket 聊天实例
我们人类的语言是有限的,为了方便管理同名但功能不同的函数,高级语言当中都引入了命名空间的概念,但是在JS当中是没有这一概念的,这次我们来仿造一个命名空间出来,可能健壮性不是很强,但可以作为一个学习的参考。
本文捎带复习JS面向对象的基本知识,以及F12脚本调试器的使用方法介绍。
我们人类的语言是有限的,为了方便管理同名但功能不同的函数,高级语言当中都引入了命名空间的概念,但是在JS当中是没有这一概念的,这次我们来仿造一个命名空间出来,可能健壮性不是很强,但可以作为一个学习的参考。
本文捎带复习JS面向对象的基本知识,以及F12脚本调试器的使用方法介绍。
首先直接贴代码:
function DefineNamespace(name) {
if (!name) { return null; }
var level = name.split(".");
var floder = window[level[0]] = window[level[0]] || {};
for (var i = 1; i < level.length; i++) {
floder = floder[level[i]] = floder[level[i]] || {};
}
}
DefineNamespace("MyNamespace.IO");
MyNamespace.IO.Read = function () {
alert("test");
}
MyNamespace.IO.Read();
这段代码在下面的运行部分首先定义了一个名为“MyNamespace.IO”的命名空间,然后为其添加Read函数,最后调用这个函数。
关注一下DefineNamespace这个函数,第一行不解释,第二行的作用是将MyNamespace.IO拆成两部分。值得关注的是第三行代码:
var
floder = window[level[0]] = window[level[0]] || {};
|
为了解释这行代码做了什么,我们可以打开IE自带的F12开发人员工具,对浏览器顶级对象window下的MyNamespace添加监视,并打上几个断点,操作如图:
按F10单步调试,当代码走过第三行时,floder被赋值了一个空对象:
在这一行代码当中我们看到了两个等号,即A=B=C的形式,那么程序会先执行B=C,将结果赋值给A。
先来看最右边的{},这是Javascript定义对象的方式,以下两行代码是等效的:
var
myObj =
new
Object();
var
myObj = {};
|
而window[level[0]]中的level[0]就是上面取到的"MyNamespace",window[level[0]]是取浏览器顶级对象window当中的"MyNamespace"子对象,我们在上面的图中可以看到这个对象一开始是空的。
所以“window[level[0]] || {}”这部分就表示先找window下有没有"MyNamespace"对象,如果没有就返回一个空对象,有就返回它自身,这样做的目的是防止第二次创建同名命名空间把第一次盖掉,如果真的同名了,就返回原来的对象,这种手段可以理解为一种单例模式。
最后把返回的命名空间对象交给floder变量,它是"MyNamespace"对应的根元素,也就是在第二张途中看到的这个空Object,这个元素被挂在了window对象当中,可以供我们调用。
然后看接下来的for循环:
for
(
var
i = 1; i < level.length; i++) {
floder = floder[level[i]] = floder[level[i]] || {};
}
|
首先i是从1开始的,也就是说,从“IO”这个子层开始的,因为对象可以通过[]这种索引器取子对象,所以这里同理先判断命名空间根元素下有没有IO这个元素,如果没有则将IO对象添加到根元素下。接下来添加第二层、第三层……
当执行完第一次后,可以看到在根元素下已经有IO对象了:
紧跟着调用后面的方法定义:
在这样,就能通过MyNamespace.IO.Read();的方式调用命名空间下的函数了。
这段代码在下面的运行部分首先定义了一个名为“MyNamespace.IO”的命名空间,然后为其添加Read函数,最后调用这个函数。
关注一下DefineNamespace这个函数,第一行不解释,第二行的作用是将MyNamespace.IO拆成两部分。值得关注的是第三行代码:
var
floder = window[level[0]] = window[level[0]] || {};
|
为了解释这行代码做了什么,我们可以打开IE自带的F12开发人员工具,对浏览器顶级对象window下的MyNamespace添加监视,并打上几个断点,操作如图:
按F10单步调试,当代码走过第三行时,floder被赋值了一个空对象:
在这一行代码当中我们看到了两个等号,即A=B=C的形式,那么程序会先执行B=C,将结果赋值给A。
先来看最右边的{},这是Javascript定义对象的方式,以下两行代码是等效的:
var
myObj =
new
Object();
var
myObj = {};
|
而window[level[0]]中的level[0]就是上面取到的"MyNamespace",window[level[0]]是取浏览器顶级对象window当中的"MyNamespace"子对象,我们在上面的图中可以看到这个对象一开始是空的。
所以“window[level[0]] || {}”这部分就表示先找window下有没有"MyNamespace"对象,如果没有就返回一个空对象,有就返回它自身,这样做的目的是防止第二次创建同名命名空间把第一次盖掉,如果真的同名了,就返回原来的对象,这种手段可以理解为一种单例模式。
最后把返回的命名空间对象交给floder变量,它是"MyNamespace"对应的根元素,也就是在第二张途中看到的这个空Object,这个元素被挂在了window对象当中,可以供我们调用。
然后看接下来的for循环:
for
(
var
i = 1; i < level.length; i++) {
floder = floder[level[i]] = floder[level[i]] || {};
}
|
首先i是从1开始的,也就是说,从“IO”这个子层开始的,因为对象可以通过[]这种索引器取子对象,所以这里同理先判断命名空间根元素下有没有IO这个元素,如果没有则将IO对象添加到根元素下。接下来添加第二层、第三层……
当执行完第一次后,可以看到在根元素下已经有IO对象了:
紧跟着调用后面的方法定义:
在这样,就能通过MyNamespace.IO.Read();的方式调用命名空间下的函数了。
发表评论
-
十八、cookie
2013-01-04 14:32 679cookie -
十七、定位
2013-01-04 14:31 676定位 -
十六、样式
2013-01-04 14:27 665样式 -
十五、事件
2013-01-04 11:17 727事件 -
十四、表格
2012-12-31 21:37 785表格 -
十三、表单
2012-12-31 21:37 719表单 -
十二、节点
2012-12-31 21:37 754节点 -
十一、DOM
2012-12-31 21:37 750DOM -
十、BOM
2012-12-31 21:37 798BOM -
八、函数式与面向对象
2012-12-28 11:58 679函数式与面向对象 -
七、正则表达式
2012-12-28 11:42 621正则表达式 -
六、运算符,语句
2012-12-28 11:42 751运算符,语句 -
五、引用类型
2012-12-27 21:28 802引用类型 -
四、prototype属性
2012-12-27 17:25 8611、prototype 在JavaScript中并没有 ... -
三、javascript:伪协议
2012-12-27 16:46 712javascript:伪协议 -
二、数组与对象
2012-12-27 16:29 721数据与对象 -
一、javascript变量
2012-12-27 12:08 766值,类型 JavaScript的变量类型不止字符串, ...
相关推荐
JavaScript 命名空间是一种组织代码的策略,用于避免全局变量污染和冲突,尤其是在大型项目中,多个组件或模块共存时。JavaScript 本身并不直接支持命名空间的概念,但可以通过对象和闭包来模拟实现。以下是一些实现...
JavaScript中的命名空间(namespace)模式是一种组织代码结构的策略,特别是在使用多个库或框架时,避免全局变量冲突和提高代码可维护性。由于JavaScript没有像C#或Java那样的内置命名空间支持,开发者需要通过...
- **定义命名空间**:通过构造函数`namespace.hello`来定义命名空间内的数据成员。 - **扩展方法**:利用`prototype`来添加方法。这样做可以避免每次创建新实例时都创建新的方法副本,节省内存资源。 - **实例化**:...
使用对象字面量来定义命名空间: ``` var comment = { list: function(){/*code...*/}, add: { post: function(){/*code...*/}, check: function(){/*code...*/} } } ``` 这种方法可以使代码看起来更加简洁,但...
TypeScript命名空间是通过`namespace`关键字定义的,它可以将相关的类型、接口、函数等封装在一起,形成一个独立的模块。例如: ```typescript namespace MyModule { export interface MyInterface {} export ...
在这个环境中,有效管理和组织代码变得越来越重要,这就引出了“命名空间”和“闭包”这两个关键概念。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 首先,我们来谈谈JavaScript的命名空间。在许多面向...
在探讨“大的法师地方js命名空间”这一主题时,我们主要关注的是JavaScript中命名空间的创建与使用。命名空间在编程领域中是一个重要的概念,它主要用于解决代码组织、避免全局变量污染以及模块化等问题。在...
在JavaScript中,并没有像其他编程语言那样提供原生的命名空间支持。因此,开发者通常会使用对象字面量的方式来模拟命名空间,即所谓的“伪命名空间”。这种方式可以有效地组织代码,减少全局变量的使用,使代码更加...
通过定义命名空间`a.b`和`test.test.abc`,分别创建了嵌套的对象和为对象添加方法的操作。测试代码显示,调用`alert(a.b)`能够访问到嵌套创建的`b`对象,而`test.test.abc.func1`则表示成功在`abc`对象上添加了`func...
JavaScript中的命名空间是一...在JavaScript中选择合适的命名空间创建方式取决于项目需求,如是否需要私有成员、代码的简洁性以及性能考虑。使用命名空间有助于提高代码的组织性和可读性,减少全局变量带来的潜在问题。
1. 命名空间定义:在JavaScript中,可以通过创建对象字面量的方式来定义命名空间。例如,可以创建一个全局对象,并在该对象下添加属性,这些属性就相当于命名空间。如示例中所示,通过创建一个名为`com`的对象,并在...
JavaScript的命名空间模拟虽然简单,但也存在一些需要注意的地方,比如在使用全局变量时应确保其唯一性,以及在创建大型项目时,需要合理地组织命名空间,避免过于复杂的结构导致的维护困难。 值得注意的是,随着...
在JavaScript中,我们通常通过一个全局对象来模拟命名空间,这样做的好处是即便在不同的文件中定义了同名的变量或函数,只要它们属于不同的命名空间,就不会发生冲突。 创建命名空间最简单的方法是直接给一个全局...
在这个命名空间下,我们可以定义各种函数或变量,例如: ```javascript comment.list = function {/* code... */}; comment.counter = 0; ``` 这样,我们就可以通过`comment.list`或`comment.counter`来调用这些...
对象字面量可以让我们在全局作用域中定义一个对象,并通过点(.)操作符来访问该对象的属性,这些属性可以是其他对象或函数,从而形成一个层级结构的命名空间。 示例代码中的`RegisterNameSpace`函数就是用来注册...
在 JavaScript 编程中,引入命名空间的概念是非常重要的。随着项目的发展和复杂度的增加,函数名冲突的问题变得越来越严重,特别是在引入多个 JavaScript 文件时。为了解决这个问题,开发者需要使用命名空间来组织...
在EXT JS中,我们可以通过`Ext.define`定义类,并指定其命名空间。例如: ```javascript Ext.define('MyApp.view.Main', { // 类的定义 }); ``` 在上述代码中,`MyApp.view`就是命名空间,`Main`是类名。当我们在...