最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解JavaScript系列(47):對(duì)象創(chuàng)建模式(上篇)

 更新時(shí)間:2015年03月04日 10:43:07   投稿:junjie  
這篇文章主要介紹了深入理解JavaScript系列(47):對(duì)象創(chuàng)建模式(上篇),本文講解了命名空間、定義依賴、私有屬性和私有方法 、Revelation模式、鏈模式等內(nèi)容,需要的朋友可以參考下

介紹

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

模式1:命名空間(namespace)

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

復(fù)制代碼 代碼如下:

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");
};

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

// 不安全,可能會(huì)覆蓋已有的MYAPP對(duì)象
var MYAPP = {};
// 還好
if (typeof MYAPP === "undefined") {
    var MYAPP = {};
}
// 更簡(jiǎn)潔的方式
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)用代碼,非常簡(jiǎn)單:
復(fù)制代碼 代碼如下:

// 通過(guò)namespace以后,可以將返回值賦給一個(gè)局部變量
var module2 = MYAPP.namespace('MYAPP.modules.module2');
console.log(module2 === MYAPP.modules.module2); // true

// 跳過(guò)MYAPP
MYAPP.namespace('modules.module51');

// 非常長(zhǎng)的名字
MYAPP.namespace('once.upon.a.time.there.was.this.long.nested.property');

模式2:定義依賴

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

復(fù)制代碼 代碼如下:

var myFunction = function () {
    // 依賴模塊
    var event = YAHOO.util.Event,
        dom = YAHOO.util.dom;

    // 其它函數(shù)后面的代碼里使用局部變量event和dom
};

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

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

復(fù)制代碼 代碼如下:

function Gadget() {
    // 私有對(duì)象
    var name = 'iPod';
    // 公有函數(shù)
    this.getName = function () {
        return name;
    };
}
var toy = new Gadget();

// name未定義,是私有的
console.log(toy.name); // undefined

// 公有方法訪問(wèn)name
console.log(toy.getName()); // "iPod"

var myobj; // 通過(guò)自執(zhí)行函數(shù)給myobj賦值
(function () {
    // 自由對(duì)象
    var name = "my, oh my";

    // 實(shí)現(xiàn)了公有部分,所以沒(méi)有var
    myobj = {
        // 授權(quán)方法
        getName: function () {
            return name;
        }
    };
} ());

模式4:Revelation模式

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

復(fù)制代碼 代碼如下:

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;
    }

    //通過(guò)賦值的方式,將上面所有的細(xì)節(jié)都隱藏了
    myarray = {
        isArray: isArray,
        indexOf: indexOf,
        inArray: indexOf
    };
} ());

//測(cè)試代碼
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è)對(duì)象的方法,比如obj.add(1).remove(2).delete(4).add(2)這樣的形式,其實(shí)現(xiàn)思路非常簡(jiǎn)單,就是將this原樣返回。代碼如下:

復(fù)制代碼 代碼如下:

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é)

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

相關(guān)文章

  • 淺析用prototype定義自己的方法

    淺析用prototype定義自己的方法

    下面小編將通過(guò)實(shí)例由淺入深講解 prototype 的具體使用方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • 深入理解JavaScript系列(48):對(duì)象創(chuàng)建模式(下篇)

    深入理解JavaScript系列(48):對(duì)象創(chuàng)建模式(下篇)

    這篇文章主要介紹了深入理解JavaScript系列(48):對(duì)象創(chuàng)建模式(下篇),本篇主要是介紹創(chuàng)建對(duì)象方面的模式的下篇,利用各種技巧可以極大地避免了錯(cuò)誤或者可以編寫(xiě)出非常精簡(jiǎn)的代碼,需要的朋友可以參考下
    2015-03-03
  • js的匿名函數(shù)使用介紹

    js的匿名函數(shù)使用介紹

    匿名函數(shù)的作用是創(chuàng)建一塊封閉區(qū)域,外面不能夠訪問(wèn)里面的變量和方法,下面為大家介紹下什么是匿名函數(shù)及其如何使用
    2013-12-12
  • javascript三元運(yùn)算符用法實(shí)例

    javascript三元運(yùn)算符用法實(shí)例

    這篇文章主要介紹了javascript三元運(yùn)算符用法實(shí)例,本文講解了三元運(yùn)算符用法實(shí)例和編程語(yǔ)言中的三元運(yùn)算符介紹,需要的朋友可以參考下
    2015-04-04
  • javascript中FOREACH數(shù)組方法使用示例

    javascript中FOREACH數(shù)組方法使用示例

    本文給大家介紹的是Array.prototype.forEach()的使用方法示例,希望對(duì)大家學(xué)習(xí)javascript能夠有所幫助。
    2016-03-03
  • 舉例講解JavaScript中關(guān)于對(duì)象操作的相關(guān)知識(shí)

    舉例講解JavaScript中關(guān)于對(duì)象操作的相關(guān)知識(shí)

    這篇文章主要介紹了舉例講解javaScript中關(guān)于對(duì)象操作的相關(guān)知識(shí),"一切皆對(duì)象"是學(xué)習(xí)JS過(guò)程中經(jīng)??梢砸?jiàn)到的一句話,本文便用一些小例子來(lái)講解JS中的對(duì)象操作,需要的朋友可以參考下
    2015-11-11
  • JavaScript之編碼規(guī)范 推薦

    JavaScript之編碼規(guī)范 推薦

    JavaScript是一種語(yǔ)法靈活,簡(jiǎn)單易懂的腳本語(yǔ)言。正因?yàn)殪`活,因此很多人在編寫(xiě)代碼時(shí),顯得很隨意,這就導(dǎo)致后期的修改、擴(kuò)展和維護(hù)變得異常困難。遵循統(tǒng)一的編碼規(guī)范,不僅對(duì)C++和Java這種編譯型語(yǔ)言很重要,對(duì)JavaScript腳本語(yǔ)言也同樣如此
    2012-05-05
  • 深入分析原生JavaScript事件

    深入分析原生JavaScript事件

    這篇文章主要介紹了原生JavaScript事件,包括DOM0事件模型、DOM2事件模型等的相關(guān)知識(shí),需要的朋友可以參考下
    2014-12-12
  • 詳解javascript中的變量提升和函數(shù)提升

    詳解javascript中的變量提升和函數(shù)提升

    這篇文章主要介紹了詳解javascript中的變量提升和函數(shù)提升的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • JavaScript 對(duì)話框和狀態(tài)欄使用說(shuō)明

    JavaScript 對(duì)話框和狀態(tài)欄使用說(shuō)明

    平時(shí)工作中,無(wú)論是調(diào)試 javascript 代碼還是進(jìn)行頁(yè)面提示,我們都會(huì)經(jīng)常使用 javascript 的對(duì)話框。除了創(chuàng)建明確不使用狀態(tài)欄的瀏覽器窗口,每個(gè)瀏覽器窗口的底部都有一個(gè)狀態(tài)欄,用來(lái)向用戶顯示一些特定的消息。
    2009-10-10

最新評(píng)論

恩施市| 麻栗坡县| 马关县| 两当县| 平度市| 米泉市| 兴城市| 苍南县| 张家港市| 望谟县| 裕民县| 化隆| 武强县| 东海县| 西藏| 合作市| 瑞金市| 喀喇沁旗| 遂平县| 金湖县| 封丘县| 镶黄旗| 海南省| 鞍山市| 剑阁县| 托里县| 阜新| 嘉荫县| 南阳市| 策勒县| 准格尔旗| 随州市| 姚安县| 扶风县| 文安县| 靖安县| 兴义市| 横峰县| 宜宾市| 黑水县| 开平市|