JavaScript模式读书笔记 第5章 对象创建模式 1

1,命名空间模式  namespace


  <script>

	

	 var myApp = {};//通过全局变量来实现命名空间

	 maApp.Parent = function (){

	 

	 };

	 myApp.Child = function(){

		

	 };

  </script>

通用命名空间函数


  <script>

	 //不安全代码

	 var myApp = {};

	 //安全代码

	 if(typeof myApp === "undefined"){

		

		var myApp = {};

	 }

	 //或者使用更短的语句

	 var myApp = myApp || {};

  </script>

使用命名空间函数


  <script>

	myApp.namespace("myApp.modules.module2");

	//等同于如下代码

	var myApp = {

		

		modules : {

			

			module2:{}

		}

	};

  </script>

<script>

	var myApp = myApp || {};

 

	myApp.namespace = function(ns_string){

 

		var parts = ns_string.split(‘.‘), parent = myApp, i;

 

		if(parent[0] === "myApp"){

			

			parts = parts.slice(1);

		}

 

		for(i = 0; i < parts.length; i++){

			

			if(typeof parent[parts[i]] === "undefined"){

				

				parent = parent[parts[i]];

			}

		}

		return parent;

	};

 

	var modules2 = myApp.namespace("myApp.modules.module2");

	console.log(modules2 === myApp.modules.module2);

 

	myApp.namespace("modules.module2");

  </script>

2,声明依赖关系

js库通常是模块化且依据命名空间组织的。


  var myFunction = function(){

     var event = YAHOO.util.event,
      dom = YAHOO.util.Dom;

}

3,私有属性和方法

JS并没有特殊的语法来表示私有。JS中所有对象的成员是公共的。


	var myObj = {

  

		myProp : 1,

	    getPro: function(){

	  

			return this.myProp;

	   }

	  

	};

	console.log(myObj.myProp);

	console.log(myObj.getPro());

但是可以使用闭包实现成员私有化。


  <script>

	function Gadget(){

	

		//私有成员

		var name = "iPoid";

		//共有函数

		this.getName = function(){

			

			return name;

		};

	}

 

	var toy = new Gadget();

 

	console.log(toy.name);//undefined

	console.log(toy.getName);//iPoid 

  </script>

私有性失效:因为涉及到引用传值,如果传递私有属性给外部,则外部可直接访问私有属性,如下:


 <script>

	function Gadget(){

	

		//私有成员

		var specs = {

			

			screen_width: 320,

			screen_hight: 650,

			color: ‘RED‘

		};

		//共有函数

		this.getSpecs = function(){

			

			return specs;

		};

	}

 

	var toy = new Gadget(),

		specs = toy.getSpecs();

	specs.color = "GUESS";

	console.log(specs.screen_width);//320

	console.log(specs.color);//GUESS

 

	console.dir(toy.getSpecs());

 

  </script>

4,对象字面量以及私有属性


    <script>

	var myObj = (function(){

		

		var name = "name";

 

		return {

			

			getName: function(){

				

				return name;

			}

		};

	}());

	

	console.log(myObj.getName());//name

  </script>

5,原型和私有性

通过prototype可以动态的给对象添加属性和方法。


  <script>

	function Gadget(){

		

		var name = "Ipod";

 

		this.getName = function(){

			

			return name;

		};

	}

 

	Gadget.prototype = (function(){

		

		var browser = "others";

 

		return{

			

			getBrowser: function(){

				

				return browser;

			}

		};

	}());

 

	var toy = new Gadget();

	console.log(toy.getName());//name

	console.log(toy.getBrowser());//others

  </script>

6,将私有方法揭示为公共方法

通过全局变量可以将匿名函数的私有方法公开。


  <script>

	  var myArray;

 

	  (function(){

		

		var astr = "[object Array]",

			toString = Object.prototype.toString;

 

			function isArray(s){

				

				return toString.call(s) === astr;

			}

 

			function indexOf(haystack, needle){

				

				var i = 0, 

					max = haystack.length;

				

				for(; i < max; i+= 1){

					

					if(haystack[i] === needle){

						

						return i;

					}

				}

				return -1;

			}

			 myArray = {isArray: isArray, 

						indexOf: indexOf,

						inArray: indexOf};

 

			

			console.log(myArray.isArray([1, 2]));//true

			console.log(myArray.isArray({0 : 1}));//false

			console.log(myArray.indexOf(["a", "b"], "a"));//0

			console.log(myArray.indexOf(["a", "b"], "d"));//-1

	  }());

 

		console.log(myArray.indexOf(["a", "b"], "a"));//0

		console.log(myArray.indexOf(["a", "b"], "d"));//-1

  </script>

7,模块模式

模块模式通过命名空间,完成函数变量定义和使用。


<script>

	myApp.namespace("myApp.util.array");

	myApp.util.array = (function(){

		

		var uobj = myApp.util.object, 

					ulang = myApp.util.lang,

					array_string = "[object Array]",

					ops = Object.prototype.toString;

		

		return {

			

			inArray: function(needle, haystack){

				

				for(var i = 0, max = haystack.length; i < max; i+= 1){

					

					if(haystack[i] === needle){

					

						return true;

					}

				}

			},

 

			isArray: function(s){

				

				return ops.call(a) === array_string;

			}

		};	

 

 

	}());

  </script>

通过揭示模式暴漏想暴漏的方法。


<script>

	myApp.namespace("myApp.util.array");

	myApp.util.array = (function(){

		

		var uobj = myApp.util.object, 

					ulang = myApp.util.lang,

					array_string = "[object Array]",

					ops = Object.prototype.toString;

		

			

			inArray: function(needle, haystack){

				

				for(var i = 0, max = haystack.length; i < max; i+= 1){

					

					if(haystack[i] === needle){

					

						return true;

					}

				}

			},

 

			isArray: function(s){

				

				return ops.call(a) === array_string;

			};	

 

			return {

				

				isArray: isArray,

				indexOf: inArray

			};

	}());

  </script>

创建构造函数的模块


    

 <script>

	myApp.namespace("myApp.util.array");

	myApp.util.array = (function(){

		

		var uobj = myApp.util.object, 

					ulang = myApp.util.lang;

 

		Constr;

 

		Constr = function(o){

			

			this.elements = this.toArray(o);

		};

 

		//共有API原型

		Constr.prototype = {

			

			constructor: myApp.util.array,

			version: "2.0",

			toArray: function(obj){

				

				for(var i = 0, a= [], len = obj.length; i < len; i+= 1){

					

					a[i] = obj[i];

				}

 

				return a;

			}

		};

 

		//返回要分配给新命名空间的构造函数

		return Constr;

	});

 

	var arr = new myApp.util.array([obj]);

  </script>

8,将全局变量导入到模块中


<script>

	MYAPP.util.module = (function(app, global){

		

		//

	}(MYAPP, this));

  </script>
时间: 2024-11-09 12:35:36

JavaScript模式读书笔记 第5章 对象创建模式 1的相关文章

JavaScript模式读书笔记 第6章 代码复用模式

主要使用代码继承来完成复用. 1,使用类式继承. -1,类式继承:按照类的方式来实现继承,即所谓的类式. -2,类式继承:通过构造函数(child)获取来自parent的属性,从而创建对象. <script> //parent function Parent(name){ this.name = name || 'Adam'; } Parent.prototype.say = function(){   return this.name; } //child function Child(na

JavaScript模式读书笔记 文章3章 文字和构造

1.对象字面量 -1.Javascript中所创建的自己定义对象在任务时候都是可变的.能够从一个空对象開始,依据须要添加函数.对象字面量模式能够使我们在创建对象的时候向其加入函数.       <script> //定义空对象 var dog = {}; //对空对象加入方法 dog.name = "Liubo"; //对对象添加方法 dog.getName = function(){ return dog.name; }; //改变属性和方法 dog.getName =

JavaScript模式读书笔记 第4章 函数

2014年11月10日 1,JavaScript函数具有两个特点: 函数是第一类对象    函数可以提供作用域 函数即对象,表现为: -1,函数可以在运行时动态创建,也可以在程序执行过程中创建. -2,函数可以分配给变量,可以将它们的引用复制到其他变量,可以被扩展,此外,函数还可以被删除. -3,可以做为参数传递给其他函数,,还可以由其他函数返回. -4,函数可以有自己的属性和方法. 2,声明VS表达式:名称和变量声明提升 //这是一个函数表达式 //它做为一个参数传递给函数 CallMe ca

JavaScript模式读书笔记 第3章 字面量和构造函数

1,对象字面量 -1,Javascript中所创建的自定义对象在任务时候都是可变的.可以从一个空对象开始,根据需要增加函数.对象字面量模式可以使我们在创建对象的时候向其添加函数.       <script> //定义空对象 var dog = {}; //对空对象添加方法 dog.name = "Liubo"; //对对象增加方法 dog.getName = function(){ return dog.name; }; //改变属性和方法 dog.getName = f

JavaScript模式读书笔记 第7章 设计模式

1,单例模式 -1,最简单的单例: <script> //obj为单例 var obj = { myProp: "My Value" }; var obj1 = obj; var obj2 = obj; console.log(obj1 == obj2);//true console.log(obj1 === obj2);//true   </script> -2,静态属性中的实例:  <script> function Universe(){ if

《javascript设计模式》笔记之第九章:组合模式

之前一直都是按照书的结构顺序做总结,觉得好像不是很好,现在试着完全按照自己的理解做总结.例子还是书上的例子. 一:组合模式的作用: 在web开发中,主要用于创建嵌套的html结点,使得我们方便的把各种结点连接起来,并且提供简易的操作.   二:组合模式的结构: 结构就像我们的文件结构一样讲Composite理解为文件夹,Leaf理解为文件就好理解了.   三:例子一,创建一个组合的表单 需求:试想着我们想要构建一个表单,但是表单域经常要被产品经理修改,我们怎样才能利用js快速的搭建这个form呢

【javascript dom读书笔记】 第九章 CSS-DOM

用dom设置样式 element.style.property = value 何时用dom脚本设置样式 作者写到:绝大多数的现代浏览器,虽然对css伪类的支持不是很完整,但是对dom都有良好的支持,所以需要考虑的是问题最简单的解决方案是什么,哪种解决方案会得到更多的浏览器支持. 在尝试了书中dom设置的实例以后,虽然代码比css要多很多,但是有一种操纵的快感,这应该是dom编程的艺术所在吧,有一种后端语言的感觉,至于实际使用中的选择,见仁见智做出更适合的自己的决定. 但最后作者说到有一种css

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5.1.2 使用参数 5.1.3 嵌套 5.1.4 多个引用 5.2 公用表表达式 5.2.1 分别列别名 5.2.2 使用参数 5.2.3 定义多个CTE 5.2.4 CTE的多次引用 5.2.5 递归CTE 5.3 视图 5.3.1 视图和ORDER BY 子句 5.3.2 视图选项 5.4 内嵌表