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

鍍金池/ 教程/ HTML/ 原型模式
中介者模式
MVVM
亨元模式
設(shè)計(jì)模式分類概覽表
ES Harmony
組合模式
CommonJS
jQuery 插件的設(shè)計(jì)模式
外觀模式
觀察者模式
建造者模式
構(gòu)造器模式
外觀模式
簡(jiǎn)介
AMD
原型模式
設(shè)計(jì)模式的分類
觀察者模式
命名空間模式
代理模式
編寫(xiě)設(shè)計(jì)模式
適配器模式
反模式
什么是設(shè)計(jì)模式
模塊化模式
MVC
Mixin 模式
裝飾模式
設(shè)計(jì)模式的結(jié)構(gòu)
單例模式
迭代器模式
命令模式
工廠模式
MVP
暴露模塊模式
惰性初始模式

原型模式

GoF將原型模式引用為通過(guò)克隆的方式基于一個(gè)現(xiàn)有對(duì)象的模板創(chuàng)建對(duì)象的模式。

我們能夠?qū)⒃湍J秸J(rèn)作是基于原型的繼承中,我們創(chuàng)建作為其它對(duì)象原型的對(duì)象.原型對(duì)象自身被當(dāng)做構(gòu)造器創(chuàng)建的每一個(gè)對(duì)象的藍(lán)本高效的使用著.如果構(gòu)造器函數(shù)使用的原型包含例如叫做name的屬性,那么每一個(gè)通過(guò)同一個(gè)構(gòu)造器創(chuàng)建的對(duì)象都將擁有這個(gè)相同的屬性。

在現(xiàn)存的(非Javascript的)語(yǔ)法中重新看一看對(duì)這個(gè)模式的定義,我們也許可以再一次發(fā)現(xiàn)對(duì)類的引用.真實(shí)的情況是那種原型繼承避免了完全使用類.理論上既不是一個(gè)"定義的“對(duì)象,也不是一個(gè)核心對(duì)象。我們可以簡(jiǎn)單的創(chuàng)建現(xiàn)存函數(shù)型對(duì)象的拷貝。

使用原型模式的好處之一就是,我們?cè)贘avaScript提供的原生能力之上工作的,而不是JavaScript試圖模仿的其它語(yǔ)言的特性.而對(duì)于其它的模式來(lái)說(shuō),情況并非如此。

這一模式不僅僅是實(shí)現(xiàn)繼承的一種簡(jiǎn)單方式,它順便還能夠帶來(lái)一點(diǎn)性能上的提升:當(dāng)定義對(duì)象的一個(gè)方法時(shí),它們都是使用引用創(chuàng)建的(因此所有的子對(duì)象都指向同一個(gè)函數(shù)),而不是創(chuàng)建屬于它們的單獨(dú)的拷貝。

對(duì)于那些有趣的,真正原型的集成,像ECMAScript 5標(biāo)準(zhǔn)中所定義的那樣,需要使用 Object.create(如我們?cè)诒竟?jié)的前面部分所見(jiàn)到的).為了提醒我們自己,Object.create創(chuàng)建了一個(gè)擁有特定原型的對(duì)象,并且也包含選項(xiàng)式的特定屬性.(例如,Object.create(prototype,optionalDescriptorObject))。

我們可以在下面的示例中看到對(duì)這個(gè)的展示:

var myCar = {

  name: "Ford Escort",

  drive: function () {
    console.log( "Weeee. I'm driving!" );
  },

  panic: function () {
    console.log( "Wait. How do you stop this thing?" );
  }

};

// Use Object.create to instantiate a new car
var yourCar = Object.create( myCar );

// Now we can see that one is a prototype of the other
console.log( yourCar.name );

Object.create也允許我們簡(jiǎn)單的繼承先進(jìn)的概念,比如對(duì)象能夠直接繼承自其它對(duì)象,這種不同的繼承.我們?cè)缦纫部吹絆bject.create允許我們使用 供應(yīng)的第二個(gè)參數(shù)來(lái)初始化對(duì)象屬性。例如:

var vehicle = {
  getModel: function () {
    console.log( "The model of this vehicle is.." + this.model );
  }
};

var car = Object.create(vehicle, {

  "id": {
    value: MY_GLOBAL.nextId(),
    // writable:false, configurable:false by default
    enumerable: true
  },

  "model": {
    value: "Ford",
    enumerable: true
  }

});

這里的屬性可以被Object.create的第二個(gè)參數(shù)來(lái)初始化,使用一種類似于我們前面看到的Object.defineProperties和Object.defineProperties方法所使用語(yǔ)法的對(duì)象字面值。

在枚舉對(duì)象的屬性,和(如Crockford所提醒的那樣)在一個(gè)hasOwnProperty()檢查中封裝循環(huán)的內(nèi)容時(shí),原型關(guān)系會(huì)造成麻煩,這一事實(shí)是值得我們關(guān)注的。

如果我們希望在不直接使用Object.create的前提下實(shí)現(xiàn)原型模式,我們可以像下面這樣,按照上面的示例,模擬這一模式:

var vehiclePrototype = {

  init: function ( carModel ) {
    this.model = carModel;
  },

  getModel: function () {
    console.log( "The model of this vehicle is.." + this.model);
  }
};

function vehicle( model ) {

  function F() {};
  F.prototype = vehiclePrototype;

  var f = new F();

  f.init( model );
  return f;

}

var car = vehicle( "Ford Escort" );
car.getModel();

注意:這種可選的方式不允許用戶使用相同的方式定義只讀的屬性(因?yàn)槿绻恍⌒牡脑抳ehicle原型可能會(huì)被改變)。

原型模式的最后一種可選實(shí)現(xiàn)可以像下面這樣:

var beget = (function () {

    function F() {}

    return function ( proto ) {
        F.prototype = proto;
        return new F();
    };
})();

一個(gè)人可以從vehicle函數(shù)引用這個(gè)方法,注意,這里的那個(gè)vehicle正是在模擬著構(gòu)造器,因?yàn)樵湍J皆趯⒁粋€(gè)對(duì)象鏈接到一個(gè)原型之外沒(méi)有任何初始化的概念。

上一篇:命名空間模式下一篇:單例模式