沙箱模式:

  • 解决空间命名模式的几个缺点:

    • 命名空间模式中无法同时使用一个应用程序或库的两个版本运行在同一个页面中,因为两者需要相同的全局符号;
    • 以点分割,需要输入更长的字符,解析时间也更长;
  • 全局构造函数 //在命名空间模式中,可以使用全局对象;在沙箱模式中主要使用全局构造函数
    • 添加特征:

      • 强制new模式
      • 接受额外配置参数,指定对象实例所需的模块名;
    • 例子
      Sandbox(['ajax','event'], function (box) {});
      --------------
      Sandbox('ajax', 'event', function (box) {});
      ---------------
      可以设置参数*表示所有可用的模块;或者不设参数来默认 Sandbox(*, function (box) {});
      Sandbox(function (box) {});
  • 增加模块: 通过增加静态属性
    Sandbox.modules = {};
    Sandbox.modules.dom = function(box) {
    box.getElement = function(){};
    box.getStyle = function(){};
    box.foo = 'bar';
    }
    Sandbox.modules.event = function(box) {
    //如果需要访问Sandbox原型
    box.constructor.prototype.m = 'mmm';
    box.attachEvent = function() {};
    box.dettachEvent = function() {};
    }
    Sandbox.modules.ajax = function(box) {
    box.makeRequest = function() {};
    box.getRequest = function() {};
    }
  • 实现构造函数
    function Sandbox() {
    //将参数转化为数组
    var args = Array.prototype.slice.call(arguments),
    //最后一个是回调函数
    callback = args.pop(),
    //提取数组或单独的模块
    modules = (args[0] && typeof args[0] === 'string') ? args : args[0],
    i;
    //强制new模式
    if(!(this instanceof Sandbox)) {
    return new Sandbox(modules, callback);
    }
    //向this添加需要的属性
    this.a = 1;
    this.b = 2;
    //向this对象添加模块
    //不指定模块或‘*’都表示使用所有模块
    if(!modules || modules === '*') {
    modules = [];
    for(i in Sandbox.modules) {
    if (Sandbox.modules.hasOwnProperty(i)) {
    modules.push(i);
    }
    }
    }
    //初始化所需模块
    for(i = 0; i < modules.length; i++) {
    Sandbox.modules[modules[i]](this);
    }
    callback(this);
    }
    //添加需要的原型属性
    Sandbox.prototype = {
    name: 'My Application',
    version: '1.0',
    getName: function() {
    return this.name;
    }
    }

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

  • 公有静态成员:

    var Gadget = function(price) {
    this.price = price;
    };
    //静态方法
    Gadget.isShiny = function () {
    var msg = 'you bet';
    if(this instanceof Gadget) {
    msg += ', it costs $' + this.price + ' !';
    }
    return msg;
    }; Gadget.prototype.isShiny = function() {
    return Gadget.isShiny.call(this);
    } var a = new Gadget('499.99');
    a.isShiny();
  • 私有静态成员:
    • 同一个构造函数创建的所有对象共享该成员;
    • 构造函数外部不能访问该成员;
      var Gadget = (function () {
      //静态变量/属性
      var counter = 0,
      NewGadget;
      NewGadget = function () {
      counter++;
      }
      //特权方法
      NewGadget.prototype.getLastId = function () {
      console.log(counter);
      }
      //
      return NewGadget;
      })(); var g1 = new Gadget();
      g1.getLastId();

对象常量:

  • 通用实现方法

    var  constant = (function () {
    var constants = {},
    ownProp = Object.prototype.hasOwnProperty,
    allowed = {
    string: 1,
    number: 1,
    boolean: 1
    },
    prefix = (Math.random() + '_').slice(2);
    return {
    set: function(name, value) {
    if(this.isDefined(name)) {
    return false;
    }
    if(!ownProp.call(allowed, typeof value)) {
    return false;
    }
    constants[prefix + name] = value;
    return true;
    },
    isDefined: function (name) {
    return ownProp.call(constants, prefix + name);
    },
    get: function (name) {
    if(this.isDefined(name)) {
    return constants[prefix + name];
    }
    return null;
    }
    }
    })();
    • set(name, value);
    • isDefined(name);
    • get(name);

链模式:用于调用对象的方法,当创建的方法返回值是无任何意义的值时,可以使它们返回this;

  • 优点:代码更简洁,;可以分割函数创建简短,具有特定功能的函数,而不是创建实现太多功能的函数;
  • 缺点:难以调试

method方法:语法糖的一种

例子:

if(typeof Function.prototype.method !== 'function') {
Function.prototype.method = function (name, implementation) {
this.prototype[name] = implementation;
return this;
}
}; var Person = function (name) {
this.name = name;
}
.method('getName', function () {
return this.name;
})
.method('setName', function (name) {
this.name = name;
return this;
}); var a = new Person('Adam');

  

javascript优化--07模式(对象)02的更多相关文章

  1. javascript优化--06模式(对象)01

    命名空间: 优点:可以解决命名混乱和第三方冲突: 缺点:长嵌套导致更长的查询时间:更多的字符: 通用命名空间函数: var MYAPP = MYAPP || {}; MYAPP.namespace = ...

  2. javascript优化--11模式(设计模式)02

    策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...

  3. javascript优化--09模式(代码复用)02

    原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...

  4. javascript优化--13模式1(DOM和浏览器模式)

    注意分离: 通过将CSS关闭来测试页面是否仍然可用,内容是否依然可读: 将JavaScript关闭来测试页面仍然可以执行正常功能:所有连接是否正常工作:所有的表单是否可以正常工作: 不使用内联处理器( ...

  5. javascript优化--08模式(代码复用)01

    优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...

  6. javascript优化--05模式(函数)

    回调函数模式: 基本例子: var findNodes = function (callback) { ...................... if (typeof callback !== ' ...

  7. javascript优化--10模式(设计模式)01

    单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...

  8. javascript优化--12模式(设计模式)03

    观察者模式 通过创建一个可观察的对象,当发生一个感兴趣的事件时将该事件通告给所有观察者,从而形成松散的耦合 订阅杂志 //发布者对象 var publisher = { subscribers: { ...

  9. javascript优化--14模式2(DOM和浏览器模式)

    远程脚本 XMLHttpRequest JSONP 和XHR不同,它不受同域的限制: JSONP请求的可以是任意的文档: 请求的URL通常格式为http://example.js?calback=Ca ...

随机推荐

  1. LR调用DLL(加密测试等)

    利用LoadRunner实现加密测试,哇咔咔2015-05-12 10:17:06标签:编译器 加密 用户在进行LoadRunner打压时,有时候请求的参数是加密的,而加密的法则是通过调用一段DLL来 ...

  2. 小白科普之JavaScript的JSON

    一.对json的理解     json是一种数据格式,不是一种编程语言,json并不从属于javascript.     json的语法可以表示以下三种类型的值     1)简单值           ...

  3. 关于visio 2007导入独立图库

    很多作网络拓扑或服务器系统拓扑时,我们都会找到相关的Visio图库来画,但很多时候我们不知如何才能够直接导入,下面是我自己的导入方式,供大家参考下! 打开07Visio,自动加载设置: 工具--> ...

  4. linux查看python安装路径,版本号

    一.想要查看ubuntu中安装的Python路径 方法一:whereis python 方法二:which python 二.想要查看ubuntu中安装的python版本号 python

  5. 把 表拷贝到test测试数据库

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) bundle exec rake db:schema:load RAILS_ENV=test   注 ...

  6. 台大《机器学习基石》课程感受和总结---Part 2 (转)

    转自:http://blog.sina.com.cn/s/blog_641289eb0101e2ld.html Part 2总结一下一个粗略的建模过程: 首先,弄清楚问题是什么,能不能用机器学习的思路 ...

  7. java笔试一

    JAVA相关基础知识2.String是最基本的数据类型吗?基本数据类型包括byte.int.char.long.float.double.boolean和short.java.lang.String类 ...

  8. 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码

    今天来做UFLDL的第二个实验,向量化.我们都知道,在matlab里面基本上如果使用for循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...

  9. Bellman-Ford算法

    #include<stdio.h> #define max 0xffffff ][]; //图的邻接矩阵 ]; int n;//顶点个数 int m;//边个数 struct Edge { ...

  10. PHP session的实现原理

    PHP SESSION原理 我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据.HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联 ...