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 相关文章推荐
基于mysql的bbs设计(五)
Oct 09 PHP
一篇不错的PHP基础学习笔记
Mar 18 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
php cli换行示例
Apr 22 PHP
smarty简单入门实例
Nov 28 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php Imagick获取图片RGB颜色值
2014/07/28 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
基于jquery的表格排序
2010/09/11 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
python协程用法实例分析
2015/06/04 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
windows下python安装小白入门教程
2018/09/18 Python
详解python播放音频的三种方法
2019/09/23 Python
Python eval函数原理及用法解析
2020/11/14 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
团队拓展活动总结
2014/08/27 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
小学生思想品德评语
2014/12/31 职场文书
导游词400字
2015/02/13 职场文书
关于军训的感想
2015/08/07 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js