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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:16:03
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了深入理解JavaScript系列(48):對象創建模式(下篇),本篇主要是介紹創建對象方面的模式的下篇,利用各種技巧可以極大地避免了錯誤或者可以編寫出非常精簡的代碼,需要的朋友可以參考下
 

介紹

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

模式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
久久九九全国免费精品观看| 国产精品99久久99久久久二8| 国产91精品久久久久| 久久香蕉国产线看观看网| 色妞欧美日韩在线| 91在线观看免费高清| 91精品国产自产在线观看永久| 国产日韩欧美夫妻视频在线观看| 欧美日韩国产精品| 色婷婷av一区二区三区在线观看| 韩国美女主播一区| 91po在线观看91精品国产性色| 欧美日韩国产一区在线| 91亚洲国产精品| 久久久亚洲天堂| 丝袜美腿亚洲一区二区| 久久偷看各类女兵18女厕嘘嘘| 中文字幕国产亚洲| 欧美成人激情视频| 亚洲欧美日韩在线一区| 亚洲激情 国产| 欧美第一淫aaasss性| 国产91精品久久久久久| 亚洲成人激情图| 国产视频精品va久久久久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲人成网7777777国产| 伊是香蕉大人久久| 在线视频国产日韩| 欧美黑人巨大精品一区二区| 热久久这里只有精品| 欧美激情精品久久久久久久变态| 色先锋资源久久综合5566| 亚洲人成五月天| 国产有码在线一区二区视频| 欧美成人午夜剧场免费观看| 国产精品自产拍在线观看中文| 日日狠狠久久偷偷四色综合免费| 久久成人在线视频| 久久久久久久激情视频| 亚洲欧美制服中文字幕| 欧美性xxxx在线播放| 国产精品扒开腿做爽爽爽的视频| 日韩在线精品一区| 亚洲精品欧美日韩| 日韩有码片在线观看| 亚洲免费伊人电影在线观看av| 亚洲网在线观看| 欧美日产国产成人免费图片| 欧美色道久久88综合亚洲精品| 欧美亚洲另类制服自拍| 国产精品久久久久久久久借妻| 91chinesevideo永久地址| 久久九九亚洲综合| 亚洲精品狠狠操| 国产日韩精品一区二区| 亚洲美女喷白浆| 欧美孕妇孕交黑巨大网站| 26uuu国产精品视频| 综合136福利视频在线| 亚洲免费影视第一页| 国产精品极品尤物在线观看| 亚洲级视频在线观看免费1级| 国产免费一区视频观看免费| 久久综合电影一区| 国产午夜精品视频免费不卡69堂| 韩国一区二区电影| 欧美午夜视频在线观看| 日韩精品在线影院| 亚洲色图狂野欧美| 中文字幕欧美精品在线| 久久夜色精品国产亚洲aⅴ| 亚洲欧美另类人妖| 久久国产精品久久久久| 69精品小视频| 久久人人爽亚洲精品天堂| 91国语精品自产拍在线观看性色| 3344国产精品免费看| 成人免费在线视频网址| 国内精品伊人久久| 久久久国产精品免费| 一本色道久久综合狠狠躁篇的优点| 乱亲女秽乱长久久久| 在线看日韩欧美| 日韩av在线看| 久久在线视频在线| 欧美精品videossex性护士| 精品国产乱码久久久久酒店| 久久久久久久av| 欧美性黄网官网| 国产精品v日韩精品| 欧美精品在线视频观看| 91亚洲精品一区| 日韩在线激情视频| 中文在线不卡视频| 成人免费淫片aa视频免费| 精品久久久久久久久中文字幕| 午夜精品免费视频| 成人精品在线观看| 欧美精品videosex牲欧美| 91人成网站www| 亚洲一级片在线看| 国产一区二中文字幕在线看| 亚洲欧美日韩天堂| 日韩av在线资源| 国产精品久久婷婷六月丁香| 欧美日韩国产色| 中文字幕亚洲在线| 久久久久亚洲精品成人网小说| 国产精品久久久久久久久久99| 国产精品第一第二| 久久亚洲精品一区二区| 亚洲精品久久7777777| 欧美高清在线观看| 欧美野外wwwxxx| 日韩欧美国产免费播放| 97色在线观看免费视频| 日韩av免费网站| 亚洲国产一区二区三区在线观看| 57pao成人永久免费视频| 久久久久久网址| 91精品国产一区| 欧美日韩国产中文字幕| 欧洲成人免费视频| 欧美色xxxx| 久久久久久亚洲精品中文字幕| 成人综合网网址| 亚洲国产精品一区二区三区| 久久久久久久一区二区三区| 日韩视频―中文字幕| 亚洲人成网7777777国产| 国产69精品久久久久99| 91夜夜揉人人捏人人添红杏| 午夜精品在线视频| 中文字幕日韩高清| 精品在线小视频| 久久噜噜噜精品国产亚洲综合| 成人免费在线视频网站| 亚洲免费成人av电影| 久久露脸国产精品| 亚洲免费av电影| 黑人巨大精品欧美一区二区| 亚洲国产精久久久久久久| 亚洲成人黄色网| 亚洲一区亚洲二区亚洲三区| 久久在精品线影院精品国产| 欧美高清视频免费观看| 日韩在线观看免费高清完整版| 欧美高清视频在线| 成人国产精品免费视频| 亚洲天堂开心观看| 亚洲国产成人爱av在线播放| 日韩av一区二区在线观看| 国产欧美精品一区二区三区-老狼| 国产精品久久一| 亚洲第一级黄色片| 欧美性生交xxxxx久久久| 亚洲自拍偷拍视频| 美女999久久久精品视频| 欧美国产日韩一区| 中国china体内裑精亚洲片| 日韩欧美国产中文字幕| 92看片淫黄大片欧美看国产片| 色久欧美在线视频观看|