命名空间:

  • 优点:可以解决命名混乱和第三方冲突;
  • 缺点:长嵌套导致更长的查询时间;更多的字符;
  • 通用命名空间函数:
    var MYAPP = MYAPP || {};
    MYAPP.namespace = function (ns_string) {
    var parts = ns_string.split('.');
    parent = MYAPP; if(parts[0] === 'MYAPP') {
    parts = parts.slice(1);
    }
    for(var i = 0; i < parts.length; i++) {
    if(typeof parent[parts[i]] === 'undefined') {
    parent[parts[i]] = {};
    }
    parent = parent[parts[i]];
    }
    return parent;
    }
    var module2 = MYAPP.namespace('MYAPP.modules.module2');

声明依赖关系:虽然已经进行了模块化命名,但再声明依赖能更优化

如对于:MYAPP, MYAPP.util.Event, MYAPP.util.Dom;
//在一个函数或模块顶部进行声明 var myFunc = function() {
var event = MYAPP.util.Event;
var dom = MYAPP.util.Dom;
................
}

解析局部变量的速度比解析全局变量快;

私有属性:

  • 私有属性和特权方法:构造函数方法

    function Gadget() {
    var name = 'iPod';
    this.getName = function () {
    return name;
    }
    }

    注意,如果私有属性设置是一个对象,且只读,那么不要将它直接返回,而是返回其浅复制后的副本;  

  • 私有属性:对象/匿名即时调用函数
    var myobj = (function () {
    var name = 'my';
    return {
    getName: function () {
    return name;
    }
    }
    }()); myobj.getName();
  • 私有属性:原型   如果是所有创建对象都需要的私有属性,可以设置到原型中
    Gadget.prototype = (function () {
    var browser = 'Mobile Webkit';
    return {
    getBrowser: function () {
    return browser;
    }
    }
    })

模块模式:

  • 组合:

    • 命名空间
    • 即时函数
    • 私有和特权成员
    • 声明依赖
  • 例子
    var MYAPP = {};
    MYAPP.namespace = function (ns_string) {
    var parts = ns_string.split('.');
    parent = MYAPP; if(parts[0] === 'MYAPP') {
    parts = parts.slice(1);
    }
    for(var i = 0; i < parts.length; i++) {
    if(typeof parent[parts[i]] === 'undefined') {
    parent[parts[i]] = {};
    }
    parent = parent[parts[i]];
    }
    return parent;
    };
    MYAPP.namespace('MYAPP.utilities.array');
    MYAPP.utilities.array = (function () {
    //依赖
    var uobj = MYAPP.utilities.object,
    ulang = MYAPP.utilities.lang,
    //私有属性
    array_string= '[object Array]',
    ops = Object.prototype.toString,
    //...
    //私有方法
    inArray = function (needle, haystack) {
    for(var i = 0, max = haystack.length; i < max; i++) {
    if(haystack[i] === needle) {
    return true;
    }
    }
    },
    isArray = function (a) {
    return ops.call(a) === array_string;
    }; //可选的一次性初始化过程 //公有API
    return {
    inArray:inArray,
    isArray:isArray,
    //...
    }
    })();
  • 例子:使用构造函数
    MYAPP.namespace('MYAPP.utilities.Array');
    MYAPP.utilities.Array = (function () {
    //依赖
    var uobj = MYAPP.utilities.object,
    ulang = MYAPP.utilities.lang,
    //私有属性和方法
    Constr; //可选的一次性初始化过程
    //.... //公有API-构造函数
    Constr = function(o) {
    this.elements = this.toArray(o);
    };
    //公有API-原型
    Constr.prototype = {
    constructor: MYAPP.utilities.Array,
    version: '2.0',
    toArray: function (obj) {
    for (var i = 0, a = [], len = obj.length; i < len; i++) {
    a[i] = obj[i];
    }
    return a;
    }
    }
    //返回要配置给新空间的构造函数
    return Constr;
    })();
    var arr = new MYAPP.utilities.Array(['a','b']);
  • 将全局变量导入模块中
    MYAPP.utilities.module = (function (app, global) {})(MYAPP, this);
    

      

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

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

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

  2. javascript优化--07模式(对象)02

    沙箱模式: 解决空间命名模式的几个缺点: 命名空间模式中无法同时使用一个应用程序或库的两个版本运行在同一个页面中,因为两者需要相同的全局符号: 以点分割,需要输入更长的字符,解析时间也更长: 全局构造 ...

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

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

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

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

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

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

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

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

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

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

  8. JavaScript基础06——Math对象和日期对象

    内置对象-Math:  Math对象用于执行 数学任务,Math 不像 Date 和 String 那样是对象的类,因此没有构造函数Math().无需创建,直接把Math当成对象使用,就可以调用其所有 ...

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

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

随机推荐

  1. 繁华模拟赛 Vicent坐电梯

    /*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[ste ...

  2. ASP.NET MVC 的URL路由介绍

    在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...

  3. gpart 使用笔记

    需求 将260G 的/home 分区拆成/home与/data,原/home分区上的数据不用保留,新/home为100G,剩余空间给/data gpart过程 1.df 结果: # Device   ...

  4. CocoaPods 使用本地代码

    CocoaPods使用方法 http://iiiyu.com/2013/12/19/learning-ios-notes-thirty-one/ 使用本地方代码的方法如下,下面建立一个名为downlo ...

  5. 在eclipse中配置一个简单的spring入门项目

    spring是一个很优秀的基于Java的轻量级开源框架,为了解决企业级应用的复杂性而创建的,spring不仅可用于服务器端开发,从简单性.可测试性和松耦合性的角度,任何java应用程序都可以利用这个思 ...

  6. Java for LeetCode 043 Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  7. Java for LeetCode 025 Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  8. Gym 100801A Alex Origami Squares (求正方形边长)

    题目:传送门.(需要下载PDF) 题意:给定一个长方形,在长方形内部画三个相同的正方形,问正方形的边长最大是多大. 题解:根据长宽比例可以算出三种情况,如果长比宽大三倍以上,那么正方形边长就是宽:如果 ...

  9. stm32——Flash读写

    stm32——Flash读写 一.Flash简介 通过对stm32内部的flash的读写可以实现对stm32的编程操作. stm32的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP( ...

  10. Fresco 源码分析(三) Fresco服务端处理(1) ImagePipeline为何物

    4.3 服务端的处理 备注: 因为是分析,而不是设计,所以很多知识我们类似于插叙的方式叙述,就是用到了哪个知识点,我们再提及相关的知识点,如果分析到了最后,我想想是不是应该将这个架构按照设计的方式,重 ...