JavaScript基础对象创建模式之命名空间(Namespace)模式(022)
JavaScript中的创建对象的基本方法有字面声明(Object Literal)和构造函数两种,但JavaScript并没有特别的语法来表示如命名空间、模块、包、私有属性、静态属性等等面向对象程序设计中的概 念。为了让JavaScript实现面向对象程序中的高级语义,人们发明了命名空间模式、依赖声明模式,模块模式,以及沙盘模式。
- // BEFORE: 5 globals
- // Warning: antipattern
- // constructors
- function Parent() {}
- function Child() {}
- // a variable
- var some_var = 1;
- // some objects
- var module1 = {};
- module1.data = {a: 1, b: 2};
- var module2 = {};
- // AFTER: 1 global
- // global object
- var MYAPP = {};
- // constructors
- MYAPP.Parent = function () {};
- MYAPP.Child = function () {};
- // a variable
- MYAPP.some_var = 1;
- // an object container
- MYAPP.modules = {};
- // nested objects
- MYAPP.modules.module1 = {};
- MYAPP.modules.module1.data = {a: 1, b: 2};
- MYAPP.modules.module2 = {};
- 变量使用起来需要敲更多的字母,js文件也因此变得更大;
- 只有一个全局变量使得所有的代码都可以使用它并修改它,这种修改可以即时生效;
- 长的嵌套的名字使得变量的解析过程需要更长的时间。
2. 通用的命名空间函数
- // unsafe
- var MYAPP = {};
- // better
- if (typeof MYAPP === "undefined") {
- var MYAPP = {};
- }
- // or shorter
- var MYAPP = MYAPP || {};
- // using a namespace function
- MYAPP.namespace('MYAPP.modules.module2');
- // equivalent to:
- // var MYAPP = {
- // modules: {
- // module2: {}
- // }
- // };
- var MYAPP = MYAPP || {};
- MYAPP.namespace = function (ns_string) {
- var parts = ns_string.split('.'),
- parent = MYAPP,
- i;
- // strip redundant leading global
- if (parts[0] === "MYAPP") {
- parts = parts.slice(1);
- }
- for (i = 0; i < parts.length; i += 1) {
- // create a property if it doesn't exist
- if (typeof parent[parts[i]] === "undefined") {
- parent[parts[i]] = {};
- }
- parent = parent[parts[i]];
- }
- return parent;
- };
- // assign returned value to a local var
- var module2 = MYAPP.namespace('MYAPP.modules.module2');
- module2 === MYAPP.modules.module2; // true
- // skip initial `MYAPP`
- MYAPP.namespace('modules.module51');
- // long namespace
- MYAPP.namespace('once.upon.a.time.there.was.this.long.nested.property');

JavaScript基础对象创建模式之命名空间(Namespace)模式(022)的更多相关文章
- JavaScript基础对象创建模式之声明依赖模式(023)
运用了命名空间(Namespace)模式后, 就可以使用一些JavaScript库了,比如YAHOO作用YUI2库的全局对象,可以通过 YAHOO.util.Dom 和 YAHOO.util.Even ...
- JavaScript基础对象创建模式之沙盘模式(026)
沙盘模式可以弥补命名空间模式中的两项不足之处: 使用唯一全局对象作为程序的全局变量入口,使得无法在同一程序中使用两个不同版本的API,因此它们使用的是同一个唯一的全局对象名,如MYAPP: 较长的嵌套 ...
- JavaScript基础对象创建模式之模块模式(Module Pattern)(025)
模块模式可以提供软件架构,为不断增长的代码提供组织形式.JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织 代码块,这些黑盒的代码块内的功能可以根据不断变化的软件 ...
- JavaScript基础对象创建模式之单体/单例模式(Singleton)
首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...
- JavaScript基础对象创建模式之静态成员(027)
在支持“类”的面向对象语言中,静态成员指的是那些所有实例对象共有的类成员.静态成员实际是是“类”的成员,而非“对象”的成员.所以如果 MathUtils类中有个叫 max()的静态成员方法,那么调用这 ...
- JavaScript基础对象创建模式之私有属性和方法(024)
JavaScript没有特殊的语法来表示对象的私有属性和方法,默认的情况下,所有的属性和方法都是公有的.如下面用字面声明的对象: var myobj = { myprop: 1, getProp: f ...
- JavaScript基础对象创建模式之链式调用模式(Chaining Pattern)(029)
链式调用模式允许一个接一个地调用对象的方法.这种模式不考虑保存函数的返回值,所以整个调用可以在同一行内完成: myobj.method1("hello").method2().me ...
- JavaScript基础对象创建模式之对象的常量(028)
虽然许多编程语言提供了const关键字来支持常量的声明,但JavaScript里没有表示常量的语义.我们可以用全大写的方式来声明变量,表明它实际上是个常量: Math.PI; // 3.1415926 ...
- javascript的对象创建模式---命名空间模式
javascript中对象的概念是很普遍的,对象是是对象,数组是对象,函数也是对象,字符串其实也是对象.常见的对象创建方法有对象字面量.构造函数创建.我们先来看看对象的创建还有哪些更高级的模式. 一. ...
随机推荐
- Java实现蓝桥杯 最短路
问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...
- Java实现蓝桥杯VIP 算法训练 sign函数
问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0,则返回0:如果x<0,则返回-1. 输入格式 一行一个实数x. 输出格式 一行一 ...
- Java实现 LeetCode 382 链表随机节点
382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶: 如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? ...
- Java实现 LeetCode 337 打家劫舍 III(三)
337. 打家劫舍 III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每 ...
- Java实现 洛谷 P1000 超级玛丽游戏
public class Main { public static void main(String[] args){ System.out.println(" ********" ...
- Java实现第九届蓝桥杯复数幂
复数幂 题目描述 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. 求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示. ...
- 简谈Java语言的继承
Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...
- https如何进行加密传输
客户端是没有证书的,也就没有公钥和私钥. SSL握手阶段,服务器把证书传输给客户端,同时也就传输了公钥(公钥是证书的一部分). 由客户端来对这个证书进行有效性认可,再由这个客户端来生成对称密钥. 对称 ...
- 构造函数继承与class继承
构造函数继承 1.子类通过apply方法或者call方法把this指向父类 js代码 function Parent(name, age) { this.name = name this.age = ...
- 如何解决在electron里无法使用puppeteer的evaluate函数
报错如图,只需要注释掉 index.html 含有 http-equiv="Content-Security-Policy 的 meta 标签就可以了.