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简单静态页生成过程
Mar 27 PHP
php REMOTE_ADDR之获取访客IP的代码
Apr 22 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
详解php的socket通信
Aug 11 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
php中this关键字用法分析
Dec 07 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
Apr 20 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
加强版phplib的DB类
2008/03/31 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
php生成无限栏目树
2017/03/16 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
使用PDB简单调试Python程序简明指南
2015/04/25 Python
详解Python中的各种函数的使用
2015/05/24 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
django最快程序开发流程详解
2019/07/19 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python实现猜拳游戏项目
2020/11/30 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
高考备战决心书
2014/03/11 职场文书
联谊活动总结
2014/08/28 职场文书
校园广播稿精选
2014/10/01 职场文书
教师读书笔记
2015/06/29 职场文书
领导欢送会主持词
2015/07/06 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers