引言:

  在javascript中创建对象是很容易的,可以使用对象字面量或者构造函数或者object.creat.在接下来的介绍中,我们将越过这些方法去寻求一些其他的对象创建模式。

  我们知道js是一种简洁明了的语言,他没有像其他语言所拥有的一些语法特征,比如命名空间,模块,包,私有属性等。那么我们又将如何通过一些模式去实现,替换那些语法特征呢?或者仅以不同于那些语法特征的方式来思考问题?

命名空间模式(namespace)

 说白了,就是在应用程序或者库中创建一个全局对像,然后把所有功能添加到改全局对象中。

 优点:减少程序中所需要的全局变量的数量,同时也有助于避免命名冲突或过长的名字前缀。

 缺点:需要输入更多的字符,附加的前缀增加了需要下载的代码量;长嵌套的名字意味着更长的属性解析查询时间。

 注意:在添加一个属性或者创建一个命名空间之前,最好是首先检查它是否已经存在。  

命名空间函数的实现实例。它是非破坏行的,如果已经存在一个命名空间,则不会重新去创建它。
var MYAPP = MYAPP || {};
MYAPP.nameSpace = function(ns_string){
  var parts = ns_string.split(","),parent = MYAPP,i;
  if(parts[0] === "MYAPP"){
    parts = parts.slice[1];  
  }
  for(i = 0;i<parts.length;i++){
    if(typeof(parent[parts[i]) === "undefined"){
      parent[parts[i]] = {};
    }
    parent = parent[parts[i]]
  }
  return parent;
}
eg:MYAPP.nameSpace(modules.module2) //MYAPP.modules.module2 = {};

声明依赖关系

在您的函数或者模块顶部声明代码所依赖的模块是一个非常好的主意。也就是创建一个局部变量并使其指向所需的模块。

优点:解析局部变量的速度要比解析全局变量要快;明确的表明了所依赖的模块
var myFunction = function(){
  var event = MYAPP.util.Event,
    dom = MYAPP.until.Dom;
}

私有属性和方法

  什么叫私有的?怎么是实现私有的?在函数中将需要保持为私有属性的数据包起来,并确保他对函数说是局部变量,这意味着外部函数不能访问它。

  特权方法就是指那些可以访问私有成员的公共方法的一个名称而已。

function Gadget(){
  var name= "ipod";
  this.getName = function(){  //特权方法
    return name
  }
}

  对象字面量以及私有性

var myobj = (function(){
  var name = "my,oh my";
  return {
    getName:function(){
      reurn name;
    }
  }
}())

  原型和私有性  

Gadget.prototype = (function(){
  var browser = "PP";
  return {
    getBrowser:function(){
      reutrn browser;
    }
  }
}())

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

var myArray = (function(){
  var astr = "[object Array]",toString = Object.prototype.toString;
  function isArray(a){
    return toString.call(a) == astr
  }
  function indexof(){
    .....
  }
  return {
    isArray:isArray,
    indexof:indexof   }
}())

 模块模式

模块模式是本书中迄今为止介绍过的多钟模式的组合,也就是下面模式的组合;

  • 命名空间
  • 声明依赖
  • 及时函数
  • 私有和特权成员
eg:MYAPP.nameSpace("untilties.Array");
MYAPP.untities.Array = (function(){
  var uobj = MYAPP.uti.Event,
  dom = MYAPP.uti.dom,Constr;
  Constr = function(o){
    this.eles = this.toArray(o)
  }
  return Constr;
}())

静态成员

静态属性和方法就是从一个实例到另外个实例都不会发生改变的属性和方法

公有静态成员

var  PP= function(){};
PP.isShiny = function(){
 return "you bet"
}
不需要创建实例,直接函数调用即可。

私有静态成员 

以同一个构造函数创建的所有对象共享该成员;构造函数外部不可访问该成员
var PP = (fucntion(){
  var counter= 0,NewPP;
  NewPP = function(){counter +=1};
  NewPP.prototype.getLastId = function(){
    return counter;
  }
  retrun NewPP;
}())
var ihone = new PP()
ihone.getLastId(); //1;
var apple = newPP();
apple.getLastId(); //2;

《Javascript模式》之对象创建模式读书笔记的更多相关文章

  1. 【读书笔记】读《JavaScript模式》 - 对象创建模式

    JavaScript是一种简洁明了的语言,其中并没有在其他语言中经常使用的一些特殊语法特征,比如命名空间(namespace).模块(module).包(package).私有属性(private p ...

  2. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  3. 《JavaScript 模式》读书笔记(5)— 对象创建模式1

    这又是一个新的开始,对象的重要性不言而喻.在JavaScript中创建对象是十分容易的,之前聊过的对象字面量和构造函数都可以达到目的.但是本篇中,我们越过那些方法,以寻求一些额外的对象创建模式. 本篇 ...

  4. 《JavaScript 模式》读书笔记(5)— 对象创建模式4

    我们学完了大部分对象创建模式相关的内容,下面还有一些小而精的部分. 七.对象常量 JavaScript中没有常量的概念,虽然许多现代的编程环境可能为您提供了用以创建常量的const语句.作为一种变通方 ...

  5. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  6. 深入理解JavaScript系列(47):对象创建模式(上篇)

    介绍 本篇主要是介绍创建对象方面的模式,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式1:命名空间(namespace) 命名空间可以减少全局命名所需的数量,避免命名冲突或过度. ...

  7. 深入理解JavaScript系列(48):对象创建模式(下篇)

    介绍 本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式6:函数语法糖 函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用pro ...

  8. 《企业应用架构模式》(POEAA)读书笔记

    原文地址:<企业应用架构模式>(POEAA)读书笔记作者:邹齐龙(技术-5013 什么是架构 Rolph Johnson认为:架构是一种主观上的东西,是专家级的项目开发人员对系统设计的一些 ...

  9. <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合

    一.前言                                                                                       几个月前的看书笔记 ...

随机推荐

  1. 手工走一次OPENSTACK安装,掉一层皮啊

    掉皮也是值得的,对OS的了解慢慢加深. 最近加入CS的Q群也学到不少.

  2. 如何通过HOOK改变windows的API函数(找到函数的相对偏移)

    我们知道,系统函数都是以DLL封装起来的,应用程序应用到系统函数时,应首先把该DLL加载到当前的进程空间中,调用的系统函数的入口地址,可以通过GetProcAddress函数进行获取.当系统函数进行调 ...

  3. 在Qt中将函数发送到主线程执行

    考虑这样一种需求,使用Qt的线程类QThread在后台执行操作(比如说拷贝文件)的时候发生了错误,产生了一个错误信息需要提醒给用户,在后台输出很显然是不够的,因为用户可能根据就没有任何控制台可供程序输 ...

  4. chrome_php logger 的实现原理

    chrome_php是什么 1.chrome_php 是什么? 一款 Chrome 下用来配合调试 PHP 的工具,可以通过,console来查看php的信息 1.2用法 用法特别简单,有一个chro ...

  5. Extjs4 自定义组件

    Ext.onReady (function () { Ext.define ('MydesktopIcon', { /* Begin Definitions */ alias: 'widget.des ...

  6. HDOJ 2089 不要62(打表)

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...

  7. python_安装工具easy_install和pip

    前言 用python就必须知道easy_install和pip这两个东西啦 easy_insall提供了在线一键安装模块或包的方便方式,而pip是easy_install的改进版,提供更好的提示信息, ...

  8. 左移运算符<<

    在许多计算机编程语言(例如:C语言.C++语言.Java语言.JavaScript语言,Pascal语言等)中,“<<”代表左移运算符(就相当于'shl').该运算符为双目运算符,结合方向 ...

  9. android style 退出动画 解决退出动画无效问题

    在AndroidMenifest.xml文件里面的Activity声明中,增加自己的Theme声明,如下: <activity android:name=".MyOrderListSe ...

  10. android 回调机制实例!

    详细实现为在类中定义接口.在接口的实现方法中传入參数(也能够不传). 在调用类中传入新建的接口.并实现未实现的方法. public class CallBackClass { //传入对应的接口作为參 ...