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

鍍金池/ 教程/ HTML/ 設(shè)計(jì)模式之原型模式
代碼復(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ì)模式之工廠模式

設(shè)計(jì)模式之原型模式

介紹

原型模式(prototype)是指用原型實(shí)例指向創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。

正文

對于原型模式,我們可以利用 JavaScript 特有的原型繼承特性去創(chuàng)建對象的方式,也就是創(chuàng)建的一個(gè)對象作為另外一個(gè)對象的 prototype 屬性值。原型對象本身就是有效地利用了每個(gè)構(gòu)造器創(chuàng)建的對象,例如,如果一個(gè)構(gòu)造函數(shù)的原型包含了一個(gè) name 屬性(見后面的例子),那通過這個(gè)構(gòu)造函數(shù)創(chuàng)建的對象都會有這個(gè)屬性。

在現(xiàn)有的文獻(xiàn)里查看原型模式的定義,沒有針對 JavaScript 的,你可能發(fā)現(xiàn)很多講解的都是關(guān)于類的,但是現(xiàn)實(shí)情況是基于原型繼承的 JavaScript 完全避免了類(class)的概念。我們只是簡單從現(xiàn)有的對象進(jìn)行拷貝來創(chuàng)建對象。

真正的原型繼承是作為最新版的 ECMAScript5 標(biāo)準(zhǔn)提出的,使用 Object.create 方法來創(chuàng)建這樣的對象,該方法創(chuàng)建指定的對象,其對象的 prototype 有指定的對象(也就是該方法傳進(jìn)的第一個(gè)參數(shù)對象),也可以包含其他可選的指定屬性。例如 Object.create(prototype, optionalDescriptorObjects),下面的例子里也可以看到這個(gè)用法:

// 因?yàn)椴皇菢?gòu)造函數(shù),所以不用大寫
var someCar = {
    drive: function () { },
    name: '馬自達(dá) 3'
};
// 使用Object.create創(chuàng)建一個(gè)新車x
var anotherCar = Object.create(someCar);
anotherCar.name = '豐田佳美';

Object.create 運(yùn)行你直接從其它對象繼承過來,使用該方法的第二個(gè)參數(shù),你可以初始化額外的其它屬性。例如:

var vehicle = {
    getModel: function () {
        console.log('車輛的模具是:' + this.model);
    }
};
var car = Object.create(vehicle, {
    'id': {
        value: MY_GLOBAL.nextId(),
        enumerable: true // 默認(rèn)writable:false, configurable:false
 },
    'model': {
        value: '福特',
        enumerable: true
    }
});

這里,可以在 Object.create 的第二個(gè)參數(shù)里使用對象字面量傳入要初始化的額外屬性,其語法與 Object.defineProperties 或 Object.defineProperty 方法類型。它允許您設(shè)定屬性的特性,例如 enumerable,writable 或 configurable。

如果你希望自己去實(shí)現(xiàn)原型模式,而不直接使用 Object.create。你可以使用像下面這樣的代碼為上面的例子來實(shí)現(xiàn):

var vehiclePrototype = {
    init: function (carModel) {
        this.model = carModel;
    },
    getModel: function () {
        console.log('車輛模具是:' + this.model);
    }
};
function vehicle(model) {
    function F() { };
    F.prototype = vehiclePrototype;
    var f = new F();
    f.init(model);
    return f;
}
var car = vehicle('福特Escort');
car.getModel();

總結(jié)

原型模式在 JavaScript 里的使用簡直是無處不在,其它很多模式有很多也是基于 prototype 的,就不多說了,這里大家要注意的依然是淺拷貝和深拷貝的問題,免得出現(xiàn)引用問題。