JavaScript创建命名空间的5种写法

 更新时间:2014年06月24日 11:00:42   投稿:junjie  
这篇文章主要介绍了JavaScript创建命名空间的5种写法,命名空间的主旨在于解决命名冲突的问题,需要的朋友可以参考下

在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:

复制代码 代码如下:

var sayHello = function() {
  return 'Hello var';
};

function sayHello(name) {
  return 'Hello function';
};

sayHello();


最终的输出为
复制代码 代码如下:

> "Hello var"

为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是按如下顺序解析的。
复制代码 代码如下:

function sayHello(name) {
  return 'Hello function';
};

var sayHello = function() {
  return 'Hello var';
};

sayHello();


不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量;

避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法。

一、通过函数(function)创建

这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:

复制代码 代码如下:

var NameSpace = NameSpace || {};
/*
Function
*/
NameSpace.Hello = function() {
  this.name = 'world';
};
NameSpace.Hello.prototype.sayHello = function(_name) {
  return 'Hello ' + (_name || this.name);
};
var hello = new NameSpace.Hello();
hello.sayHello();

这种写法比较冗长,不利于压缩代码(jQuery使用fn代替prototype),而且调用前需要先实例化(new)。使用Object写成JSON形式可以写得紧凑些:

二、通过JSON对象创建Object

复制代码 代码如下:

/*
Object
*/
var NameSpace = NameSpace || {};
NameSpace.Hello = {
    name: 'world'
  , sayHello: function(_name) {
    return 'Hello ' + (_name || this.name);
  }
};

调用
复制代码 代码如下:

NameSpace.Hello.sayHello('JS');
> Hello JS;

这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。

三、通过闭包(Closure)和Object实现

在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:

复制代码 代码如下:

var NameSpace = NameSpace || {};
NameSpace.Hello = (function() {
  //待返回的公有对象
  var self = {};
  //私有变量或方法
  var name = 'world';
  //公有方法或变量
  self.sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
  //返回的公有对象
  return self;
}());

四、Object和闭包的改进型写法

上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。

复制代码 代码如下:

var NameSpace = NameSpace || {};
NameSpace.Hello = (function() {
  var name = 'world';
  var sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
  return {
    sayHello: sayHello
  };
}());

五、Function的简洁写法

这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:

复制代码 代码如下:

var NameSpace = NameSpace || {};
NameSpace.Hello = new function() {
  var self = this;
  var name = 'world';
  self.sayHello = function(_name) {
    return 'Hello ' + (_name || name);
  };
};

欢迎补充。

相关文章

  • PHP实现word转pdf的两种方式(有用!)

    PHP实现word转pdf的两种方式(有用!)

    最近遇到一个需求,将word文件转换成pdf,辗转了一上午终于搞定了,下面这篇文章主要给大家介绍了关于PHP实现word转pdf的两种方式,需要的朋友可以参考下
    2022-09-09
  • 浅谈PHP7中的一些小技巧

    浅谈PHP7中的一些小技巧

    PHP7显著提高了整体性能。实际上主要的特性有null合并运算符或返回类型声明。如果你不知道它们,那么你应该去查看PHP文档。这里有一些很少人知道的、可能有用的特性。
    2021-05-05
  • PHP进阶学习之依赖注入与Ioc容器详解

    PHP进阶学习之依赖注入与Ioc容器详解

    这篇文章主要介绍了PHP进阶学习之依赖注入与Ioc容器,结合实例形式详细分析了依赖注入与Ioc容器概念、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-06-06
  • 全面解读PHP的人气开发框架Laravel

    全面解读PHP的人气开发框架Laravel

    这篇文章主要介绍了PHP的人气开发框架Laravel,并对一些主要的技术特点进行了相关的举例,需要的朋友可以参考下
    2015-10-10
  • PHP实现的获取文件mimes类型工具类示例

    PHP实现的获取文件mimes类型工具类示例

    这篇文章主要介绍了PHP实现的获取文件mimes类型工具类,结合实例形式分析了php针对文件mimes类型的相关判断操作技巧,需要的朋友可以参考下
    2018-04-04
  • Swoole 5将移除自动添加Event::wait()特性详解

    Swoole 5将移除自动添加Event::wait()特性详解

    这篇文章主要给大家介绍了关于Swoole 5将移除自动添加Event::wait()特性的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Swoole5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 探讨Hessian在PHP中的使用分析

    探讨Hessian在PHP中的使用分析

    本篇文章是对Hessian在PHP中的使用进行了详细的分析介绍, 需要的朋友参考下
    2013-06-06
  • 领悟php接口中interface存在的意义

    领悟php接口中interface存在的意义

    本篇文章是对php接口中interface存在的意义进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php中socket通信机制实例详解

    php中socket通信机制实例详解

    这篇文章主要介绍了php中socket通信机制,讲述了socket通信机制的原理,并以实例形式较为详细的分析了socket通信机制的用法,需要的朋友可以参考下
    2015-01-01
  • php中导出数据到excel时数字变为科学计数的解决方法

    php中导出数据到excel时数字变为科学计数的解决方法

    导出数据到excel时数字变为科学计数的解决方法,有需要的朋友可以参考下
    2013-02-02

最新评论