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的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php表单请求获得数据求和示例
May 15 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
浅谈PHP中output_buffering
Jul 13 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
PHP-FPM 的管理和配置详解
Feb 17 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
JS跨域代码片段
2012/08/30 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
python获取目录下所有文件的方法
2015/06/01 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
电气专业应届生求职信
2013/11/01 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
辅导员学期工作总结
2015/08/14 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Win11快速关闭所有广告推荐
2022/04/19 数码科技