所谓代码,当你随便命名一个变量: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. Vue.js—快速入门

    Vue.js是什么 Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目 ...

  2. Ocelot API网关的实现剖析

    在微软Tech Summit 2017 大会上和大家分享了一门课程<.NET Core 在腾讯财付通的企业级应用开发实践>,其中重点是基于ASP.NET Core打造可扩展的高性能企业级A ...

  3. IdentityServer4 禁用 Consent screen page(权限确认页面)

    IdentityServer4 在登录完成的适合,会再跳转一次页面(权限确认),如下: 我之前以为 IdentityServer4 就是这样使用的,但实际业务场景并不需要进行权限确认,而是登陆成功后直 ...

  4. G彩娱乐网【分享】想要开源自己的代码可以参考一下

    作为一个开发者,如果你打算开源自己的代码,千万不要忘记,选择一种开源许可证(license). 许多开发者对开源许可证了解很少,不清楚有哪些许可证,应该怎么选择.本文介绍开源许可证的基本知识,主要参考 ...

  5. NLP论文泛读之《教材在线评论的情感倾向性分析》

    NLP论文泛读之<教材在线评论的情感倾向性分析> 本文借助细粒度情感分类技术, 对从网络上抓取大量计算机专业本科教材的评价文本进行情感极性 分析, 从而辅助商家和出版社改进教材的质量.制定 ...

  6. hibernate flushMode 错误

    1 十一月 15, 2017 10:13:36 上午 org.apache.struts2.dispatcher.Dispatcher error 2 严重: Exception occurred d ...

  7. [转载] Dubbo实现RPC调用使用入门

    转载自http://shiyanjun.cn/archives/341.html 使用Dubbo进行远程调用实现服务交互,它支持多种协议,如Hessian.HTTP.RMI.Memcached.Red ...

  8. linux操作系统基础篇(九)

    shell脚本的运算符与流程控制 1.运算符 1.1 算术运算符 + - * / % [root@MiWiFi-R3-srv ~]# echo $[3+1]4 1.2 关系操作 与(())连用 < ...

  9. HTML基础--元素类型及类型转换

    元素类型及类型转换 一.XHTML元素分类 根据css显示分类,XHTML元素被分为三种类型:块状元素,内联元素,可变元素 1.块状元素(block element) 1)块状元素在网页中就是以块的形 ...

  10. 利用vertical-align实现行内元素对齐

    实际项目中,常常会遇到一排行内元素对齐排列的需求,但是往往它们是这样的 我们想要的其实是这样的 曾经我一度不得不使用定位来实现我想要的位置效果,将父元素设置 position:relative ,行内 ...