JavaScript创建命名空间的5种写法

2015-01-24信息快讯网

这篇文章主要介绍了JavaScript创建命名空间的5种写法,命名空间的主旨在于解决命名冲突的问题,需要的朋友可以参考下

在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 PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
php格式输出文件var_export函数实例
javascript some()函数用法详解
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
PHP自动重命名文件实现方法
Laravel 4 初级教程之视图、命名空间、路由
PHP中使用Session配合Javascript实现文件上传进度条功能
PHP中几个可以提高运行效率的代码写法、技巧分享
PHP命名空间(namespace)的动态访问及使用技巧
PHP命名空间(namespace)的使用基础及示例
php上传图片之时间戳命名(保存路径)
2个Codeigniter文件批量上传控制器写法例子
php实现斐波那契数列的简单写法
kohana框架上传文件验证规则写法示例
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
PHP获取windows登录用户名的方法
PHP网页游戏学习之Xnova(ogame)源码解读(十)
PHP网页游戏学习之Xnova(ogame)源码解读(九)
PHP网页游戏学习之Xnova(ogame)源码解读(八)
PHP网页游戏学习之Xnova(ogame)源码解读(七)
PHP网页游戏学习之Xnova(ogame)源码解读(六)
ThinkPHP3.1新特性之命名范围的使用
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Codeigniter操作数据库表的优化写法总结
PHP命名空间(Namespace)简明教程
PHP三元运算的2种写法代码实例
php 创建以UNIX时间戳命名的文件夹(示例代码)
php命名空间学习详解
检查用户名是否已在mysql中存在的php写法
©2014-2024 dbsqp.com