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 session有效期问题
Apr 26 PHP
php array_search() 函数使用
Apr 13 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
php使用curl出现Expect:100-continue解决方法
Mar 03 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
php获取微信openid方法总结
Oct 10 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
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
原装进口全世界:天猫国际
2016/08/03 全球购物
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
大学生职业生涯规划书范文
2014/01/14 职场文书
党性教育心得体会
2014/09/03 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
感谢信怎么写
2015/01/21 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
MySQL创建管理HASH分区
2022/04/13 MySQL