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+SqlServer实现分页显示
Oct 09 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
php中关于socket的系列函数总结
May 18 PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php数字游戏 计算24算法
2012/06/10 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
python实现简单的TCP代理服务器
2014/10/08 Python
python正则表达式之作业计算器
2016/03/18 Python
Python3 Random模块代码详解
2017/12/04 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python面向对象进阶学习
2019/05/21 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
婚庆答谢词
2015/01/04 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
学术会议领导致辞
2015/07/29 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
什么是Python装饰器?如何定义和使用?
2022/04/11 Python