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


Posted in PHP onJune 24, 2014

在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 相关文章推荐
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
curl和libcurl的区别简介
Jul 01 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
Mar 21 PHP
php通过文件头判断格式的方法
May 28 PHP
php 解决扫描二维码下载跳转问题
Jan 13 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP获取windows登录用户名的方法
Jun 24 #PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 #PHP
PHP判断表单复选框选中状态完整例子
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 #PHP
You might like
神族 Protoss 剧情介绍
2020/03/14 星际争霸
PHP 批量删除 sql语句
2009/06/05 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js闭包的用途详解
2014/11/09 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
Python匹配中文的正则表达式
2016/05/11 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
python回调函数中使用多线程的方法
2017/12/25 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
eBay德国站:eBay.de
2017/09/14 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
入党积极分子个人总结
2015/03/02 职场文书
物流仓管员岗位职责
2015/04/01 职场文书