`

九、在JavaScript当中定义命名空间

 
阅读更多

我们人类的语言是有限的,为了方便管理同名但功能不同的函数,高级语言当中都引入了命名空间的概念,但是在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();的方式调用命名空间下的函数了。

分享到:
评论

相关推荐

    javascript简单实现命名空间效果.docx

    JavaScript 命名空间是一种组织代码的策略,用于避免全局变量污染和冲突,尤其是在大型项目中,多个组件或模块共存时。JavaScript 本身并不直接支持命名空间的概念,但可以通过对象和闭包来模拟实现。以下是一些实现...

    浅析JavaScript中命名空间namespace模式_.docx

    JavaScript中的命名空间(namespace)模式是一种组织代码结构的策略,特别是在使用多个库或框架时,避免全局变量冲突和提高代码可维护性。由于JavaScript没有像C#或Java那样的内置命名空间支持,开发者需要通过...

    javascript创建命名空间的5种写法_.docx

    - **定义命名空间**:通过构造函数`namespace.hello`来定义命名空间内的数据成员。 - **扩展方法**:利用`prototype`来添加方法。这样做可以避免每次创建新实例时都创建新的方法副本,节省内存资源。 - **实例化**:...

    JavaScript 编程引入命名空间的方法

    使用对象字面量来定义命名空间: ``` var comment = { list: function(){/*code...*/}, add: { post: function(){/*code...*/}, check: function(){/*code...*/} } } ``` 这种方法可以使代码看起来更加简洁,但...

    TypeScript命名空间 命名空间块化.zip

    TypeScript命名空间是通过`namespace`关键字定义的,它可以将相关的类型、接口、函数等封装在一起,形成一个独立的模块。例如: ```typescript namespace MyModule { export interface MyInterface {} export ...

    js命名空间和闭包

    在这个环境中,有效管理和组织代码变得越来越重要,这就引出了“命名空间”和“闭包”这两个关键概念。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 首先,我们来谈谈JavaScript的命名空间。在许多面向...

    大的法师地方js命名空间

    在探讨“大的法师地方js命名空间”这一主题时,我们主要关注的是JavaScript中命名空间的创建与使用。命名空间在编程领域中是一个重要的概念,它主要用于解决代码组织、避免全局变量污染以及模块化等问题。在...

    javascript自执行函数之伪命名空间封装法.docx

    在JavaScript中,并没有像其他编程语言那样提供原生的命名空间支持。因此,开发者通常会使用对象字面量的方式来模拟命名空间,即所谓的“伪命名空间”。这种方式可以有效地组织代码,减少全局变量的使用,使代码更加...

    JavaScript创建命名空间(namespace)的最简实现

    通过定义命名空间`a.b`和`test.test.abc`,分别创建了嵌套的对象和为对象添加方法的操作。测试代码显示,调用`alert(a.b)`能够访问到嵌套创建的`b`对象,而`test.test.abc.func1`则表示成功在`abc`对象上添加了`func...

    javascript创建命名空间的5种写法__1.docx

    JavaScript中的命名空间是一...在JavaScript中选择合适的命名空间创建方式取决于项目需求,如是否需要私有成员、代码的简洁性以及性能考虑。使用命名空间有助于提高代码的组织性和可读性,减少全局变量带来的潜在问题。

    javascript简单实现命名空间效果

    1. 命名空间定义:在JavaScript中,可以通过创建对象字面量的方式来定义命名空间。例如,可以创建一个全局对象,并在该对象下添加属性,这些属性就相当于命名空间。如示例中所示,通过创建一个名为`com`的对象,并在...

    javascript模拟命名空间

    JavaScript的命名空间模拟虽然简单,但也存在一些需要注意的地方,比如在使用全局变量时应确保其唯一性,以及在创建大型项目时,需要合理地组织命名空间,避免过于复杂的结构导致的维护困难。 值得注意的是,随着...

    Javascript 面向对象 命名空间

    在JavaScript中,我们通常通过一个全局对象来模拟命名空间,这样做的好处是即便在不同的文件中定义了同名的变量或函数,只要它们属于不同的命名空间,就不会发生冲突。 创建命名空间最简单的方法是直接给一个全局...

    javascript高级编程JavaScript.pdf

    在这个命名空间下,我们可以定义各种函数或变量,例如: ```javascript comment.list = function {/* code... */}; comment.counter = 0; ``` 这样,我们就可以通过`comment.list`或`comment.counter`来调用这些...

    JavaScript 面向对象之命名空间

    对象字面量可以让我们在全局作用域中定义一个对象,并通过点(.)操作符来访问该对象的属性,这些属性可以是其他对象或函数,从而形成一个层级结构的命名空间。 示例代码中的`RegisterNameSpace`函数就是用来注册...

    JavaScript 编程引入命名空间的方法与代码

    在 JavaScript 编程中,引入命名空间的概念是非常重要的。随着项目的发展和复杂度的增加,函数名冲突的问题变得越来越严重,特别是在引入多个 JavaScript 文件时。为了解决这个问题,开发者需要使用命名空间来组织...

    EXT dojochina Ext命名空间别名.rar

    在EXT JS中,我们可以通过`Ext.define`定义类,并指定其命名空间。例如: ```javascript Ext.define('MyApp.view.Main', { // 类的定义 }); ``` 在上述代码中,`MyApp.view`就是命名空间,`Main`是类名。当我们在...

Global site tag (gtag.js) - Google Analytics