所谓代码,当你随便命名一个变量:var name = "ukerxi"; 就是一句代码;但当你的代码写出来后,对于后续维护及阅读的人,就可以看出代码是否,易读,易理解;优雅的代码总是遵守一定的规范,这篇文章就说说几种命名空间的运用,运用好了,可以有利于多人开发,模块化代码,代码解耦有一定的作用!

先来看看一个错误的示范:

// 定义一些数据
var name = "ukerxi";
var version = "1.0.0";
var hobby = "riding";
sessionStorage.data = 'test';
sessionStorage.text = 'test';
sessionStorage.name = 'test';

利用命名空间进行重构:

var men = {
name: 'ukerxi',
version: '1.0.0',
hobby: 'riding'
}
// 由于 sessionStorage 只支持字符型的数据,所以必须将数据进行JSON化处理
sessionStorage.message = JSON.stringify({
data: 'test',
text: 'test',
name: 'test',
});

重构后只产生了两个全局变量,减少了命名冲突的概率,对于全局变量的使用,必须尽量减少,特别是单页面开始时;而sessionStorage等本地存储的使用更加注意,由于它们在多页面之间可以互相访问,很容易造成命名冲突;一下更具体的介绍几种命名空间的使用:

一、使用单例对象进行包裹(单例模式)

var myObj = {
name: "ukerxi"
};
myObj.fn = function{
// do something
};

多人开发时,可以根据自己的名字进行命名一个对象,然后自己写的变量及函数都放进这个命名空间中,这样就避免与他人冲突;在实际开发时,还会遇到多个文件之间共享一个命名空间,可以使用命名空间检测,避免重复或覆盖;例如:

// 方法一
if (typeof myObj === "undefined") {
var myObj = {};
} // 方法二(推荐)
var myObj = myObj || {};

当你只是想对一个命名空间进行扩展,形如,对插件进行扩展,在JQuery.extend() 方法的扩展;

var myObj=(function(o){
o.addFn = ""; // 实现扩展属性功能
return o;
})(window.myObj || {}); // 必须或上空对象,以便在没有事先声明而使用引起的错误

二、闭包实现变量的包裹,减少全局变量

var myObj = (function () {
// 私有变量
var name = "ukerxi"; // 返回get方法
return {
getName: function () {
return name;
}
};
}()); // 可以变通成更加通用的命名空间
var commonObject = (function(){
var _data = {
name: "ukerxi",
version: "1.0"
}
//返回get/set方法
return {
get: function(key){
return _data[key];
},
set: function(key, value){
// 检测是否存在要设置的值在不在原本的数据中,这样做是不添加新数据
//如果要添加新数据,这句可以不加
if(typeof _data[key] != "undefined"){
_data[key] = value;
}else{
return false;
}
}
}
}());

通过返回的getter、setter方法进行读取及设置值,这样就不用担心变量命名冲突;

三、使用构造函数&原型方法,可以构造出更加强大的命名空间

function CommonObj(name) {
// 私有变量
// 此处可以不用定义内部的_name变量,因为参数也是私有变量
var _name = name;
// 公用方法
this.getName = function () {
return _name;
};
}
CommonObj.prototype = (function () {
//静态私有变量,所有实例方法共享这个数据
var _static = "static";
//
return {
getStatic: function () {
return _static;
}
};
}()); var newObj1 = new CommonObj("obj1");
var newObj2 = new CommonObj("obj2");
// 测试输出
console.log(newObj1.getName()); // -- "obj1"
console.log(newObj2.getName()); // -- "obj2"
console.log(newObj1.getStatic); // -- "static"
console.log(newObj2.getStatic); // -- "static"

最终每次实例化 CommonObj 构造函数时可以进行赋值,然而原型上的属性是共享的;上面代码看起来还是分散的,可以进一步进行改进;

var CommonObj = (function () {
// 静态私有变量
var _static = "";
function _fn(name) {
// 公用方法
this.getName = function () {
return name;
};
} // 定义原型方法
_fn.prototype ={
getStatic: function () {
return _static;
}
}
// 返回真正的构造函数
return _fn; }()); var newObj1 = new CommonObj();
var newObj2 = new CommonObj();
// 测试输出
console.log(newObj1.getName()); // -- "obj1"
console.log(newObj2.getName()); // -- "obj2"
console.log(newObj1.getStatic); // -- "static"
console.log(newObj2.getStatic); // -- "static"

四、函数的静态调用与非静态调用

主要特性是,通过类自身定义的属性是不会被实例化函数拥有及继承的,故也可以看做是一种命名空间,后续结合设计模式的“建造者”模式,可以创造出强大的一种运用形式;

// 构造函数
var MyObj = function (name) {
this.name = name;
}; // 静态方法
MyObj.getName = function () {
console.log("test");
}; // 原型方法
MyObj.prototype.getName = function () {
console.log(this.name);
}; // 静态调用
MyObj.getName(); // "test"
// 实例化调用
var fn = new MyObj("ukerxi");
fn.getName(); // ukerxi
一种特别的自执行方式形成的命名

五、最后再介绍一种特别的自执行方式形成的命名空间

var CommonObj = ({
fn: function() {console.log("test");},
name: "ukerxi",
init: function(){
console.log(this.name);
return this;
}
}).init();

上面例子相当于新建一个对象,然后执行 init方法,最后返回 this 指向这个对象,最后CommonObj 就包含了新建对象的引用;当然实际运用中不建议这样用,只是用来装大神的;

【结束语】

系列文章,包括了原创,翻译,转载等各类型的文章;一方面是为了自己总结,另一方面页希望可以共享知识;在技术方面有输入,也要有所输出,才能更进一步!文章基于自己的实践、阅读及理解,如有不合理及错误的地方,烦请各大佬评论指出,以便改正,感谢!

javascript 命名空间与运用(前端基础系列)的更多相关文章

  1. js作用域与执行环境(前端基础系列)

    一.作用域(what?) 官方解释是:"一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域." 单从文字理解比较难懂,举个栗子: ...

  2. 学习JavaScript数据结构与算法---前端进阶系列

    学习建议 1.视频学习---认知 建议:在中国慕课上找"数据结构"相关的视频教程.中国大学MOOC 推荐清华大学.北京大学.浙江大学的教程,可先试看,然后根据自身的情况选择视频进行 ...

  3. 前端基础系列——CSS规范(文章内容为转载)

    原作者信息 作者:词晖 链接:http://www.zhihu.com/question/19586885/answer/48933504 来源:知乎 著作权归原作者所有,转载请联系原作者获得授权. ...

  4. navigator.userAgent浏览器检测(前端基础系列)

    对于前端来说,浏览器检测已经不陌生了,在做一些页面是,需要针对不同的浏览器进行处理不同的逻辑,最简单的就是区分pc和移动端的浏览器,或是android 和ios下的浏览器. 一.浏览器检测的由来?  ...

  5. “use strict” 严格模式使用(前端基础系列)

    ECMAscript5添加一种严格模式的运行模式("use strict"),让你的js语句在更加严格的环境下进行运行: 一.主要作用: 消除版本javascript中一些不合理及 ...

  6. 【前端基础系列】slice方法将类数组转换数组实现原理

    问题描述 在日常编码中会遇到将类数组对象转换为数组的问题,其中常用到的一种方式使用Array.prototype.slice()方法. 类数组对象 所谓的类数组对象,JavaScript对它们定义为: ...

  7. 【前端基础系列】理解bind方法使用与实现

    方法描述 bind()方法创建一个新函数,当被调用时,将其this关键字设置为提供的值. 语法说明 fn.bind(thisArg,arg1,arg2,..) 参数说明 thisArg:当绑定函数被调 ...

  8. 【前端基础系列】理解GET与POST请求区别

    语义区别 GET请求用于获取数据 POST请求用于提交数据 缓存 GET请求能被缓存,以相同的URL再去GET请求会返回304 POST请求不能缓存 数据长度 HTTP协议从未规定过GET/POST请 ...

  9. javascript基础系列(入门前须知)

    -----------------------小历史---------------------------- javascript与java是两种语言,他们的创作公司不同,JavaScript当时是借 ...

随机推荐

  1. Sudoku Killer

    Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...

  2. code force 403B.B. The Meeting Place Cannot Be Changed

    B. The Meeting Place Cannot Be Changed time limit per test 5 seconds memory limit per test 256 megab ...

  3. XML学习笔记之XML的简介

    最近,自学了一段时间xml,希望通过学习笔记的整理能够巩固一下知识点,也希望把知识分享给你们(描红字段为重点): XML(extensible Markup language):可扩展的标记语言,解决 ...

  4. Java多线程其他

    1.interrupt()方法 interrupt方法不会真正中断线程,它只会清楚线程的wait,sleep,join的受阻状态,时线程重新获得CPU的执行权. 此时如果再次调用线程的wait,sle ...

  5. ldap数据库--ldapsearch,ldapmodify

    简单介绍一下ldapsearch命令,在ldap搜索条目时很有用,只要适当调整filter就可以. 命令如下: ldapsearch -h hostname -p port -b baseDN -D ...

  6. Linux 基本命令-----常用操作分类

    Linux/Unix 命令格式: 命令名 [选项] [参数] 注:[]中的内容代表内容可以省略 例:$ ls $ ls -l #-l 是选项 开始符号: 文件名 或 文件夹名 .当前文件夹 ..上一级 ...

  7. MySQLbase

    /*多行注释*/-- 单行注释-- 创建用户: CREATE USER '用户名'[@'主机名'] IDENTIFIED BY '密码'-- 主机名可以为空,省略主机名表示默认权限为%, 所有主机都可 ...

  8. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  9. C#对话框的使用

    [函数] <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon);[函数 ...

  10. File signature analysis failed to recognize .old file

    My friend May she found a strange file called "bkp.old" as below in the evidence files. Sh ...