`
holdbelief
  • 浏览: 704952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript模拟命名空间

阅读更多

JavaScript模拟命名空间

在C++和C#中,命名空间用于尽可能地减少名称冲突。例如,在.NET Framework中,命名空间有助于将Microsoft.Build.Task.Message类与System.Messaging.Message区分开来。JavaScript没有任何特定语言功能来支持命名空间,但很容易使用对象来模拟命名空间。如果要创建一个JavaScript库,则可以将它们包装在命名空间内,而不需要定义全局函数和类,如下所示:

var MSDNMagNS.Pet = function(name)
{
        // code here;
};

MSDNMagNs.Pet.prototype.toString = function()
{
        // code
};

var pet = new MSDNMagNS.Pet("Yammer");

 命名空间的一个级别可能不是唯一的,因此可以创建嵌套的命名空间:

var MSDNMagNS = {};
// nested namespace "Examples"
MSDNMagNS.Examples = {};

MSDNMagNS.Examples.Pet = function(name)
{
        // code
};

MSDNMagNS.Examples.Pet.prototype.toString = function()
{
        // code
};

var pet = new MSDNMagNS.Examples.Pet("Yammer");

 可以想象,键入这些冗长的嵌套命名空间会让人很累。幸运的是,库用户可以很容易地为命名空间指定更短的别名:

// MSDNMagNS.Examples and Pet definition...

// think "using Eg = MSDNMagNS.Examples;"

var Eg = MSDNMagNS.Examples;
var pet = new Eg.Pet("Yammer");
alert(pet);

 如果看一下Microsoft Ajax库的源代码,就会发现库的作者使用了类似的技术来实现命名空间(请参阅静态方法Type.registerNamespace的实现)。

OOP 和 ASP.NET AJAX

在ASP.NET AJAX中实现的OOP与在本文中讨论的规范实现稍有不同,这主要有两个原因:ASP.NET AJAX版本提供了更多反射可能性(它是诸如 xml 脚本等声明性语法和参数验证所必需的),而且ASP.NET AJAX的目标是将使用.NET的开发人员所熟悉的某些其它构造(例如属、事件、枚举和接口)转换成JavaScript。

在JavaScript当前广泛使用的版本中,它缺少.NET开发人员所熟悉的几个OOP的关键概念,而ASP.NET AJAX可以模拟其中的大多数。

根据命名约定(要遵守的示例),类可以有属性访问器,以及多播事件(符合紧密反映由.NET提供的约定的模式)。私有变量遵守成员以下划线开头则为私有的约定。很少有机会用到真正的私有变量,此策略是为了使调试程序能够监测到这些变量。引入接口也是为了使类型检查能够避免常见的鸭子定型法(一种类型方案,它基于的概念是:如果有什么物体走路和叫声像鸭子,那么它就是鸭子,或至少可以将它视为鸭子)。

类和反射

在JavaScript中,没有办法知道函数的名称。即使这是可能的,但在大多数情况下也没有什么用,因为类构造函数通常是通过向命名空间变量分配匿名函数来构造的。实际构成类型名称的是此变量的完全限定名称,它同样不可访问,并且构造函数本身对它一无所知。为了规避此限制,并使JavaScript类有丰富的反射,ASP.NET AJAX需要将类型名称进行注册。

ASP.NET AJAX中反射的API将检查所有类型(无论是内置类型、类、接口、命名空间或者甚至是枚举),而它们包括的类似.NET Framework 的函数(例如 isInstanceOfType和inheritsFrom)可以在运行时检查类的层次结构。ASP.NET AJAX 还会在调试模式下执行某些类型检查,这对开发人员更早的捕获Bug很有帮助。

注册类层次结构和调用基础函数

若要在ASP.NET AJAX中定义类,您需要将其构造函数赋给变量(注意,构造函数如何调用举出函数):

MyNamespace.MyClass = function()
{
        MyNamespace.MyClass.initializeBase(this);
        this._myProperty = null;
}

Then, you need to define the class members itself in its prototype:

MyNamespace.MyClass.prototype = 
{
        get_myProperty:function()
        {
                return this._myProperty;
        },
        set_myProperty:function(value)
        {
                this._myProperty = value;
        },
        doSomething: function()
        {
                MyNamespace.MyClass.callBaseMethod(this,"doSomething");
                /* do something more */
        }
}

最终注册类:
MyNamespace.MyClass.registerClass("MyNamespace.MyClass", MyNamespace.BaseClass);

此处不需要管理构造函数和原型层次结构,因为这由registerClass函数自动完成。

Bertrand Le Roy 是 ASP.NET AJAX 团队的软件设计工程师 II。 
 

下一节:应当这样编写 JavaScript 代码吗?

分享到:
评论

相关推荐

    javascript模拟命名空间

    这导致了JavaScript开发者需要寻找其它方法来模拟命名空间,以解决作用域污染和全局变量冲突的问题。 利用JavaScript的对象,我们可以轻松模拟出命名空间的效果。对象在JavaScript中可以作为一种容器,用来存储函数...

    jquery命名空间模拟

    本篇文章将深入探讨如何在JavaScript中模拟jQuery的命名空间,以实现更有序、更安全的代码组织。 首先,我们需要理解JavaScript的命名空间是如何工作的。由于JavaScript本身没有内置的命名空间机制,我们通常通过...

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

    JavaScript 本身并不直接支持命名空间的概念,但可以通过对象和闭包来模拟实现。以下是一些实现命名空间的常见方法: 1. **对象嵌套**: 在给定的示例中,`com.anyjava` 是一个命名空间,它通过对象嵌套的方式创建...

    Javascript 命名空间模式

    在JavaScript这种没有原生命名空间支持的语言中,通过创建一个全局对象并将所有功能附加到这个对象下面,可以模拟实现类似命名空间的效果。这种方式通常用于大型项目或库,以保持代码的整洁和可维护性。 在描述中...

    js命名空间和闭包

    然而,JavaScript并没有原生支持命名空间,但它可以通过模拟实现,常见的方法有对象字面量、立即执行函数表达式(IIFE)和模块化(如CommonJS、ES6模块)等。 1. 对象字面量:这是一种创建命名空间的简单方式,通过...

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

    因此,开发者通常会使用对象字面量的方式来模拟命名空间,即所谓的“伪命名空间”。这种方式可以有效地组织代码,减少全局变量的使用,使代码更加模块化。 #### 四、结合自执行函数与伪命名空间 通过结合自执行函数...

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

    在 JavaScript 中,没有命名空间的概念,需要使用对象来模拟命名空间。下面是一个基本的命名空间实现方法: 1. 定义一个构造函数,用于创建命名空间: ``` function NameSpace(){} ``` 2. 创建一个命名空间对象: `...

    javascript高级编程JavaScript.pdf

    在JavaScript中,我们可以使用对象来模拟命名空间。例如,我们创建一个构造函数`NameSpace`,它实际上不执行任何操作,但可以用来创建一个新的命名空间: ```javascript function NameSpace() {} ``` 然后,我们...

    javascript 类和命名空间的模拟代码

    首先,我们来看看如何模拟命名空间。命名空间的主要目的是避免全局变量污染,提高代码的可读性和可维护性。在JavaScript中,可以使用对象字面量或函数来模拟命名空间: 1. 对象字面量方式: ```javascript ...

    JavaScript 命名空间 使用介绍

    但在JavaScript中,通常使用函数作用域来模拟命名空间的行为。 由于JavaScript的函数作用域特性,所有的变量和函数都属于这个作用域,而JavaScript中的块级作用域(例如使用if语句或循环创建的作用域)并不会创建一...

    javascript简单实现命名空间效果

    尽管JavaScript原生并不支持命名空间,但是开发者可以使用一些技巧来模拟命名空间的效果。以下是一些关于如何在JavaScript中简单实现命名空间效果的知识点: 1. 命名空间定义:在JavaScript中,可以通过创建对象...

    浅析JavaScript中命名空间namespace模式

    由于JavaScript没有内置的命名空间或包管理机制,开发者通常通过模拟实现这一概念。在提供的例子中,`MYAPP` 是一个全局对象,用作整个应用程序的命名空间。 创建命名空间的常见方法是使用对象属性来模拟层级结构。...

    Javascript 面向对象 命名空间

    在JavaScript中虽然没有像Java或者.NET那样的命名空间声明,但通过约定俗成的方式来模拟命名空间,以避免全局作用域中变量名的冲突。下面将详细介绍如何在JavaScript中创建和使用命名空间。 首先,命名空间在...

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

    JavaScript 本身不支持命名空间的概念,但可以使用对象来模拟命名空间。我们可以定义一个构造函数,例如 `NameSpace`,然后使用该构造函数创建一个命名空间对象。例如: ``` function NameSpace() {} ``` 接着,...

    JavaScript 面向对象之命名空间

    这个过程是通过`eval`函数来完成的,虽然`eval`通常被视为危险函数,但在这种特定情况下,它用于在当前作用域内执行字符串形式的JavaScript代码,以创建或引用命名空间对象。 例如,我们可以这样注册几个命名空间:...

Global site tag (gtag.js) - Google Analytics