亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入理解JavaScript系列(48):對象創建模式(下篇)

2019-11-20 13:01:15
字體:
來源:轉載
供稿:網友

介紹

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

模式6:函數語法糖

函數語法糖是為一個對象快速添加方法(函數)的擴展,這個主要是利用prototype的特性,代碼比較簡單,我們先來看一下實現代碼:

復制代碼 代碼如下:

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

這樣就給Person函數添加了getName和setName這2個方法,接下來我們來驗證一下結果:
復制代碼 代碼如下:

var a = new Person('Adam');
console.log(a.getName()); // 'Adam'
console.log(a.setName('Eve').getName()); // 'Eve'

模式7:對象常量

對象常量是在一個對象提供set,get,ifDefined各種方法的體現,而且對于set的方法只會保留最先設置的對象,后期再設置都是無效的,已達到別人無法重載的目的。實現代碼如下:

復制代碼 代碼如下:

var constant = (function () {
    var constants = {},
        ownProp = Object.prototype.hasOwnProperty,
    // 只允許設置這三種類型的值
        allowed = {
            string: 1,
            number: 1,
            boolean: 1
        },
        prefix = (Math.random() + "_").slice(2);

    return {
        // 設置名稱為name的屬性
        set: function (name, value) {
            if (this.isDefined(name)) {
                return false;
            }
            if (!ownProp.call(allowed, typeof value)) {
                return false;
            }
            constants[prefix + name] = value;
            return true;
        },
        // 判斷是否存在名稱為name的屬性
        isDefined: function (name) {
            return ownProp.call(constants, prefix + name);
        },
        // 獲取名稱為name的屬性
        get: function (name) {
            if (this.isDefined(name)) {
                return constants[prefix + name];
            }
            return null;
        }
    };
} ());

驗證代碼如下:

復制代碼 代碼如下:

// 檢查是否存在
console.log(constant.isDefined("maxwidth")); // false

// 定義
console.log(constant.set("maxwidth", 480)); // true

// 重新檢測
console.log(constant.isDefined("maxwidth")); // true

// 嘗試重新定義
console.log(constant.set("maxwidth", 320)); // false

// 判斷原先的定義是否還存在
console.log(constant.get("maxwidth")); // 480

模式8:沙盒模式

沙盒(Sandbox)模式即時為一個或多個模塊提供單獨的上下文環境,而不會影響其他模塊的上下文環境,比如有個Sandbox里有3個方法event,dom,ajax,在調用其中2個組成一個環境的話,和調用三個組成的環境完全沒有干擾。Sandbox實現代碼如下:

復制代碼 代碼如下:

function Sandbox() {
    // 將參數轉為數組
    var args = Array.prototype.slice.call(arguments),
    // 最后一個參數為callback
        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.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 += 1) {
        Sandbox.modules[modules[i]](this);
    }

    // 調用 callback
    callback(this);
}

// 默認添加原型對象
Sandbox.prototype = {
    name: "My Application",
    version: "1.0",
    getName: function () {
        return this.name;
    }
};

然后我們再定義默認的初始模塊:

復制代碼 代碼如下:

Sandbox.modules = {};

Sandbox.modules.dom = function (box) {
    box.getElement = function () {
    };
    box.getStyle = function () {
    };
    box.foo = "bar";
};

Sandbox.modules.event = function (box) {
    // access to the Sandbox prototype if needed:
    // box.constructor.prototype.m = "mmm";
    box.attachEvent = function () {
    };
    box.detachEvent = function () {
    };
};

Sandbox.modules.ajax = function (box) {
    box.makeRequest = function () {
    };
    box.getResponse = function () {
    };
};

調用方式如下:

復制代碼 代碼如下:

// 調用方式
Sandbox(['ajax', 'event'], function (box) {
    console.log(typeof (box.foo));
    // 沒有選擇dom,所以box.foo不存在
});

Sandbox('ajax', 'dom', function (box) {
    console.log(typeof (box.attachEvent));
    // 沒有選擇event,所以event里定義的attachEvent也不存在
});

Sandbox('*', function (box) {
    console.log(box); // 上面定義的所有方法都可訪問
});


通過三個不同的調用方式,我們可以看到,三種方式的上下文環境都是不同的,第一種里沒有foo; 而第二種則沒有attachEvent,因為只加載了ajax和dom,而沒有加載event; 第三種則加載了全部。

模式9:靜態成員

靜態成員(Static Members)只是一個函數或對象提供的靜態屬性,可分為私有的和公有的,就像C#或Java里的public static和private static一樣。

我們先來看一下公有成員,公有成員非常簡單,我們平時聲明的方法,函數都是公有的,比如:

復制代碼 代碼如下:

// 構造函數
var Gadget = function () {
};

// 公有靜態方法
Gadget.isShiny = function () {
    return "you bet";
};

// 原型上添加的正常方法
Gadget.prototype.setPrice = function (price) {
    this.price = price;
};

// 調用靜態方法
console.log(Gadget.isShiny()); // "you bet"

// 創建實例,然后調用方法
var iphone = new Gadget();
iphone.setPrice(500);

console.log(typeof Gadget.setPrice); // "undefined"
console.log(typeof iphone.isShiny); // "undefined"
Gadget.prototype.isShiny = Gadget.isShiny;
console.log(iphone.isShiny()); // "you bet"

而私有靜態成員,我們可以利用其閉包特性去實現,以下是兩種實現方式。

第一種實現方式:

復制代碼 代碼如下:

var Gadget = (function () {
    // 靜態變量/屬性
    var counter = 0;

    // 閉包返回構造函數的新實現
    return function () {
        console.log(counter += 1);
    };
} ()); // 立即執行

var g1 = new Gadget(); // logs 1
var g2 = new Gadget(); // logs 2
var g3 = new Gadget(); // logs 3


可以看出,雖然每次都是new的對象,但數字依然是遞增的,達到了靜態成員的目的。

第二種方式:

復制代碼 代碼如下:

var Gadget = (function () {
    // 靜態變量/屬性
    var counter = 0,
        NewGadget;

    //新構造函數實現
    NewGadget = function () {
        counter += 1;
   };

    // 授權可以訪問的方法
    NewGadget.prototype.getLastId = function () {
        return counter;
    };

    // 覆蓋構造函數
    return NewGadget;
} ()); // 立即執行

var iphone = new Gadget();
iphone.getLastId(); // 1
var ipod = new Gadget();
ipod.getLastId(); // 2
var ipad = new Gadget();
ipad.getLastId(); // 3


數字也是遞增了,這是利用其內部授權方法的閉包特性實現的。

總結

這是對象創建模式的下篇,兩篇一起總共9種模式,是我們在日常JavaScript編程中經常使用的對象創建模式,不同的場景起到了不同的作用,希望大家根據各自的需求選擇適用的模式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产高清福利视频| 欧美精品videossex88| 91超碰中文字幕久久精品| 日韩一区二区欧美| 最近2019中文字幕mv免费看| 欧美激情女人20p| 国产精品久久久久久久av电影| 国产福利精品视频| 日韩免费高清在线观看| 久久国内精品一国内精品| 国产精品极品尤物在线观看| 欧美男插女视频| 91午夜理伦私人影院| 中文字幕日韩精品在线观看| 国产日韩av在线播放| 欧美性开放视频| 国产精品一区二区在线| 久久久噜久噜久久综合| 国内成人精品视频| 国产精品中文在线| 日本免费一区二区三区视频观看| 欧美成人精品激情在线观看| 欧美资源在线观看| 欧美亚洲在线视频| 亚洲欧美日本另类| 国产精品一区二区三区在线播放| 亚洲成色999久久网站| 亚洲福利视频在线| 日韩欧美在线观看视频| 久久久精品在线观看| 北条麻妃在线一区二区| 久久久这里只有精品视频| 在线免费观看羞羞视频一区二区| 国产亚洲欧美aaaa| 亚洲理论片在线观看| 国产精品视频免费在线观看| 日韩激情视频在线播放| 日本中文字幕久久看| 精品av在线播放| 高清欧美性猛交xxxx黑人猛交| 日韩成人激情在线| 欧美性20hd另类| 亚洲一区二区三区四区在线播放| 日本精品视频在线观看| 中文字幕国产日韩| 精品女厕一区二区三区| 久久久久久12| 国外成人免费在线播放| 欧美第一黄网免费网站| 久久久精品网站| 国产婷婷成人久久av免费高清| 国产精品成人一区二区三区吃奶| 国模精品一区二区三区色天香| 精品国产31久久久久久| 欧美激情中文字幕在线| 亚洲午夜久久久久久久| 久久亚洲欧美日韩精品专区| 中文字幕日韩免费视频| 久久综合伊人77777尤物| 456国产精品| 国产成人精品亚洲精品| 国产精品a久久久久久| 另类图片亚洲另类| 成人国产精品久久久| 国产美女主播一区| 日韩a**中文字幕| 国产精品欧美在线| 亚洲自拍另类欧美丝袜| 日韩亚洲国产中文字幕| 国产精品男人爽免费视频1| 日韩视频精品在线| 日本韩国在线不卡| 日本三级韩国三级久久| 亚洲精品国产福利| 国产高清在线不卡| 成人a免费视频| 亚洲高清色综合| 亚洲激情免费观看| 九九久久久久久久久激情| 欧美成人免费一级人片100| 亚洲欧美日韩网| 成人免费观看a| 国产精品自产拍在线观看中文| 国产精品老女人视频| 欧美亚洲成人免费| 亚洲精品一区中文| 国产精品免费一区二区三区都可以| 国产精品日韩在线播放| 一区二区三区视频免费在线观看| 久久露脸国产精品| 国产一区二区三区中文| 欧美成人sm免费视频| 一区二区欧美久久| 在线成人激情视频| 粗暴蹂躏中文一区二区三区| 亚洲高清久久网| 国产99久久久欧美黑人| 亚洲色图综合网| 日韩黄色高清视频| 亚洲国产美女久久久久| 成人黄色短视频在线观看| 久久国产色av| 欧美一级视频一区二区| 日韩电影中文字幕在线观看| 成人免费淫片视频软件| 最近2019中文字幕在线高清| 久久99精品国产99久久6尤物| 欧美性受xxx| 成人字幕网zmw| 久久国产精品久久国产精品| 97免费视频在线| 亚洲欧美国产高清va在线播| 久久亚洲电影天堂| 国产精品日日摸夜夜添夜夜av| 国产精品日韩在线观看| 国产精品久久久久久超碰| 欧美激情亚洲精品| 久久久www成人免费精品张筱雨| 亚洲精品女av网站| 欧美精品少妇videofree| 欧美日韩电影在线观看| 日韩欧美中文在线| 国产亚洲欧洲高清一区| 亚洲网站在线观看| 欧美最猛性xxxxx(亚洲精品)| 亚洲在线免费看| 97精品在线视频| 中文在线资源观看视频网站免费不卡| 操91在线视频| 久久免费精品日本久久中文字幕| 92国产精品视频| xxxxx成人.com| 久久夜色精品国产欧美乱| 久久成人免费视频| 国产欧美久久一区二区| 日韩久久精品成人| 久久国产精品偷| 欧美乱大交xxxxx| 欧美亚洲一级片| 久色乳综合思思在线视频| 国产精品xxx视频| 国产精品视频一区二区高潮| 51视频国产精品一区二区| 久久99久久99精品中文字幕| 成人免费淫片视频软件| 操日韩av在线电影| 亚洲成人亚洲激情| 亚洲va国产va天堂va久久| 欧美激情二区三区| 国产玖玖精品视频| 欧美日韩精品国产| 欧美成人精品不卡视频在线观看| 精品香蕉一区二区三区| 夜夜嗨av色综合久久久综合网| 国产91色在线免费| 性色av一区二区三区免费| 久久影视电视剧免费网站清宫辞电视| 亚洲精品久久久久久下一站| 国产一区二区三区高清在线观看| 久热精品视频在线观看一区| 国产成+人+综合+亚洲欧美丁香花| 国产网站欧美日韩免费精品在线观看| 日韩精品久久久久久福利| 亚洲视频自拍偷拍|