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

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

構(gòu)造器模式

在面向?qū)ο缶幊讨校瑯?gòu)造器是一個(gè)當(dāng)新建對(duì)象的內(nèi)存被分配后,用來(lái)初始化該對(duì)象的一個(gè)特殊函數(shù)。在JavaScript中幾乎所有的東西都是對(duì)象,我們經(jīng)常會(huì)對(duì)對(duì)象的構(gòu)造器十分感興趣。

對(duì)象構(gòu)造器是被用來(lái)創(chuàng)建特殊類(lèi)型的對(duì)象的,首先它要準(zhǔn)備使用的對(duì)象,其次在對(duì)象初次被創(chuàng)建時(shí),通過(guò)接收參數(shù),構(gòu)造器要用來(lái)對(duì)成員的屬性和方法進(jìn)行賦值。

對(duì)象創(chuàng)建

下面是我們創(chuàng)建對(duì)象的三種基本方式:

下面的每一種都會(huì)創(chuàng)建一個(gè)新的對(duì)象:

var newObject = {};

// or
var newObject = Object.create( null );

// or
var newObject = new Object();

最后一個(gè)例子中"Object"構(gòu)造器創(chuàng)建了一個(gè)針對(duì)特殊值的對(duì)象包裝,只不過(guò)這里沒(méi)有傳值給它,所以它將會(huì)返回一個(gè)空對(duì)象。

有四種方式可以將一個(gè)鍵值對(duì)賦給一個(gè)對(duì)象:

// ECMAScript 3 兼容形式

// 1. “點(diǎn)號(hào)”法

// 設(shè)置屬性
newObject.someKey = "Hello World";

// 獲取屬性
var key = newObject.someKey;

// 2. “方括號(hào)”法

// 設(shè)置屬性
newObject["someKey"] = "Hello World";

// 獲取屬性
var key = newObject["someKey"];

// ECMAScript 5 僅兼容性形式
// For more information see: http://kangax.github.com/es5-compat-table/

// 3. Object.defineProperty方式

// 設(shè)置屬性
Object.defineProperty( newObject, "someKey", {
    value: "for more control of the property's behavior",
    writable: true,
    enumerable: true,
    configurable: true
});

// 如果上面的方式你感到難以閱讀,可以簡(jiǎn)短的寫(xiě)成下面這樣:

var defineProp = function ( obj, key, value ){
  config.value = value;
  Object.defineProperty( obj, key, config );
};

// 為了使用它,我們要?jiǎng)?chuàng)建一個(gè)“person”對(duì)象
var person = Object.create( null );

// 用屬性構(gòu)造對(duì)象
defineProp( person, "car",  "Delorean" );
defineProp( person, "dateOfBirth", "1981" );
defineProp( person, "hasBeard", false );

// 4. Object.defineProperties方式

// 設(shè)置屬性
Object.defineProperties( newObject, {

  "someKey": { 
    value: "Hello World", 
    writable: true 
  },

  "anotherKey": { 
    value: "Foo bar", 
    writable: false 
  } 

});

// 3和4中的讀取屬行可用1和2中的任意一種

在這本書(shū)的后面一點(diǎn),這些方法會(huì)被用于繼承,如下:

// 使用:

// 創(chuàng)建一個(gè)繼承與Person的賽車(chē)司機(jī)
var driver = Object.create( person );

// 設(shè)置司機(jī)的屬性
defineProp(driver, "topSpeed", "100mph");

// 獲取繼承的屬性 (1981)
console.log( driver.dateOfBirth );

// 獲取我們?cè)O(shè)置的屬性 (100mph)
console.log( driver.topSpeed );

基礎(chǔ)構(gòu)造器

正如我們先前所看到的,Javascript不支持類(lèi)的概念,但它有一種與對(duì)象一起工作的構(gòu)造器函數(shù)。使用new關(guān)鍵字來(lái)調(diào)用該函數(shù),我們可以告訴Javascript把這個(gè)函數(shù)當(dāng)做一個(gè)構(gòu)造器來(lái)用,它可以用自己所定義的成員來(lái)初始化一個(gè)對(duì)象。

在這個(gè)構(gòu)造器內(nèi)部,關(guān)鍵字this引用到剛被創(chuàng)建的對(duì)象?;氐綄?duì)象創(chuàng)建,一個(gè)基本的構(gòu)造函數(shù)看起來(lái)像這樣:

function Car( model, year, miles ) {

  this.model = model;
  this.year = year;
  this.miles = miles;

  this.toString = function () {
    return this.model + " has done " + this.miles + " miles";
  };
}

// 使用:

// 我們可以示例化一個(gè)Car
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );

// 打開(kāi)瀏覽器控制臺(tái)查看這些對(duì)象toString()方法的輸出值
// output of the toString() method being called on
// these objects
console.log( civic.toString() );
console.log( mondeo.toString() );

上面這是個(gè)簡(jiǎn)單版本的構(gòu)造器模式,但它還是有些問(wèn)題。一個(gè)是難以繼承,另一個(gè)是每個(gè)Car構(gòu)造函數(shù)創(chuàng)建的對(duì)象中,toString()之類(lèi)的函數(shù)都被重新定義。這不是非常好,理想的情況是所有Car類(lèi)型的對(duì)象都應(yīng)該引用同一個(gè)函數(shù)。 這要謝謝 ECMAScript3和ECMAScript5-兼容版,對(duì)于構(gòu)造對(duì)象他們提供了另外一些選擇,解決限制小菜一碟。

使用“原型”的構(gòu)造器

在Javascript中函數(shù)有一個(gè)prototype的屬性。當(dāng)我們調(diào)用Javascript的構(gòu)造器創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)prototype上的屬性對(duì)于所創(chuàng)建的對(duì)象來(lái)說(shuō)都看見(jiàn)。照這樣,就可以創(chuàng)建多個(gè)訪問(wèn)相同prototype的Car對(duì)象了。下面,我們來(lái)擴(kuò)展一下原來(lái)的例子:

function Car( model, year, miles ) {

  this.model = model;
  this.year = year;
  this.miles = miles;

}

// 注意這里我們使用Note here that we are using Object.prototype.newMethod 而不是
// Object.prototype ,以避免我們重新定義原型對(duì)象
Car.prototype.toString = function () {
  return this.model + " has done " + this.miles + " miles";
};

// 使用:

var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );

console.log( civic.toString() );
console.log( mondeo.toString() );

通過(guò)上面代碼,單個(gè)toString()實(shí)例被所有的Car對(duì)象所共享了。

上一篇:外觀模式下一篇:暴露模塊模式