在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 對象創(chuàng)建模式(上篇)
代碼復(fù)用模式(避免篇)
S.O.L.I.D 五大原則之接口隔離原則 ISP
設(shè)計(jì)模式之狀態(tài)模式
JavaScript 核心(晉級高手必讀篇)
設(shè)計(jì)模式之建造者模式
JavaScript 與 DOM(上)——也適用于新手
設(shè)計(jì)模式之中介者模式
設(shè)計(jì)模式之裝飾者模式
設(shè)計(jì)模式之模板方法
設(shè)計(jì)模式之外觀模式
強(qiáng)大的原型和原型鏈
設(shè)計(jì)模式之構(gòu)造函數(shù)模式
揭秘命名函數(shù)表達(dá)式
深入理解J avaScript 系列(結(jié)局篇)
執(zhí)行上下文(Execution Contexts)
函數(shù)(Functions)
《你真懂 JavaScript 嗎?》答案詳解
設(shè)計(jì)模式之適配器模式
設(shè)計(jì)模式之組合模式
設(shè)計(jì)模式之命令模式
S.O.L.I.D 五大原則之單一職責(zé) SRP
編寫高質(zhì)量 JavaScript 代碼的基本要點(diǎn)
求值策略
閉包(Closures)
對象創(chuàng)建模式(上篇)
This? Yes,this!
設(shè)計(jì)模式之代理模式
變量對象(Variable Object)
S.O.L.I.D 五大原則之里氏替換原則 LSP
面向?qū)ο缶幊讨话憷碚?/span>
設(shè)計(jì)模式之單例模式
Function 模式(上篇)
S.O.L.I.D 五大原則之依賴倒置原則 DIP
設(shè)計(jì)模式之迭代器模式
立即調(diào)用的函數(shù)表達(dá)式
設(shè)計(jì)模式之享元模式
設(shè)計(jì)模式之原型模式
根本沒有“JSON 對象”這回事!
JavaScript 與 DOM(下)
面向?qū)ο缶幊讨?ECMAScript 實(shí)現(xiàn)
全面解析 Module 模式
對象創(chuàng)建模式(下篇)
設(shè)計(jì)模式之職責(zé)鏈模式
S.O.L.I.D 五大原則之開閉原則 OCP
設(shè)計(jì)模式之橋接模式
設(shè)計(jì)模式之策略模式
設(shè)計(jì)模式之觀察者模式
代碼復(fù)用模式(推薦篇)
作用域鏈(Scope Chain)
Function 模式(下篇)
設(shè)計(jì)模式之工廠模式

對象創(chuàng)建模式(上篇)

介紹

本篇主要是介紹創(chuàng)建對象方面的模式,利用各種技巧可以極大地避免了錯(cuò)誤或者可以編寫出非常精簡的代碼。

模式 1:命名空間(namespace)

命名空間可以減少全局命名所需的數(shù)量,避免命名沖突或過度。一般我們在進(jìn)行對象層級定義的時(shí)候,經(jīng)常是這樣的:

var app = app || {};
app.moduleA = app.moduleA || {};
app.moduleA.subModule = app.moduleA.subModule || {};
app.moduleA.subModule.MethodA = function () {
    console.log("print A");
};
app.moduleA.subModule.MethodB = function () {
    console.log("print B");
};

如果層級很多的話,那就要一直這樣繼續(xù)下去,很是混亂。namespace 模式就是為了解決這個(gè)問題而存在的,我們看代碼:

// 不安全,可能會(huì)覆蓋已有的MYAPP對象
var MYAPP = {};
// 還好
if (typeof MYAPP === "undefined") {
    var MYAPP = {};
}
// 更簡潔的方式
var MYAPP = MYAPP || {};  
//定義通用方法
MYAPP.namespace = function (ns_string) {
    var parts = ns_string.split('.'),
        parent = MYAPP,
        i;  
    // 默認(rèn)如果第一個(gè)節(jié)點(diǎn)是MYAPP的話,就忽略掉,比如MYAPP.ModuleA
    if (parts[0] === "MYAPP") {
        parts = parts.slice(1);
    }  
    for (i = 0; i < parts.length; i += 1) {
        // 如果屬性不存在,就創(chuàng)建
        if (typeof parent[parts[i]] === "undefined") {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }
    return parent;
};

調(diào)用代碼,非常簡單:

// 通過namespace以后,可以將返回值賦給一個(gè)局部變量
var module2 = MYAPP.namespace('MYAPP.modules.module2');
console.log(module2 === MYAPP.modules.module2); // true  
// 跳過MYAPP
MYAPP.namespace('modules.module51');  
// 非常長的名字
MYAPP.namespace('once.upon.a.time.there.was.this.long.nested.property');

模式 2:定義依賴

有時(shí)候你的一個(gè)模塊或者函數(shù)可能要引用第三方的一些模塊或者工具,這時(shí)候最好將這些依賴模塊在剛開始的時(shí)候就定義好,以便以后可以很方便地替換掉。

var myFunction = function () {
    // 依賴模塊
    var event = YAHOO.util.Event,
        dom = YAHOO.util.dom;  
    // 其它函數(shù)后面的代碼里使用局部變量event和dom
};

模式 3:私有屬性和私有方法

JavaScript 本書不提供特定的語法來支持私有屬性和私有方法,但是我們可以通過閉包來實(shí)現(xiàn),代碼如下:

function Gadget() {
    // 私有對象
    var name = 'iPod';
    // 公有函數(shù)
    this.getName = function () {
        return name;
    };
}
var toy = new Gadget();  
// name未定義,是私有的
console.log(toy.name); // undefined  
// 公有方法訪問name
console.log(toy.getName()); // "iPod"  
var myobj; // 通過自執(zhí)行函數(shù)給myobj賦值
(function () {
    // 自由對象
    var name = "my, oh my";  
    // 實(shí)現(xiàn)了公有部分,所以沒有var
    myobj = {
        // 授權(quán)方法
        getName: function () {
            return name;
        }
    };
} ());

模式 4:Revelation模式

也是關(guān)于隱藏私有方法的模式,和《深入理解JavaScript系列(3):全面解析Module模式》里的 Module 模式有點(diǎn)類似,但是不是 return 的方式,而是在外部先聲明一個(gè)變量,然后在內(nèi)部給變量賦值公有方法。代碼如下:

var myarray;
(function () {
    var astr = "[object Array]",
        toString = Object.prototype.toString;  
    function isArray(a) {
        return toString.call(a) === astr;
    }  
    function indexOf(haystack, needle) {
        var i = 0,
            max = haystack.length;
        for (; i < max; i += 1) {
            if (haystack[i] === needle) {
                return i;
            }
        }
        return -1;
    }  
    //通過賦值的方式,將上面所有的細(xì)節(jié)都隱藏了
    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", "z"], "z")); // 2
console.log(myarray.inArray(["a", "b", "z"], "z")); // 2  
myarray.indexOf = null;
console.log(myarray.inArray(["a", "b", "z"], "z")); // 2

模式 5:鏈模式

鏈模式可以你連續(xù)可以調(diào)用一個(gè)對象的方法,比如 obj.add(1).remove(2).delete(4).add(2)這樣的形式,其實(shí)現(xiàn)思路非常簡單,就是將 this 原樣返回。代碼如下:

var obj = {
    value: 1,
    increment: function () {
        this.value += 1;
        return this;
    },
    add: function (v) {
        this.value += v;
        return this;
    },
    shout: function () {
        console.log(this.value);
    }
};  
// 鏈方法調(diào)用
obj.increment().add(3).shout(); // 5  
// 也可以單獨(dú)一個(gè)一個(gè)調(diào)用
obj.increment();
obj.add(3);
obj.shout();

總結(jié)

本篇是對象創(chuàng)建模式的上篇,敬請期待明天的下篇。

同步與推薦

深入理解 JavaScript 系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動(dòng)力。