成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

constructor設(shè)計(jì)模式

leanote / 1718人閱讀

摘要:對(duì)象的構(gòu)造函數(shù)用于創(chuàng)建特定類型的對(duì)象既要準(zhǔn)備使用對(duì)象,也要接收參數(shù),構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)可以用來(lái)設(shè)置成員屬性和方法的值。

在經(jīng)典的面向?qū)ο缶幊陶Z(yǔ)言中,constructor是一個(gè)特殊的方法,被用來(lái)初始化一個(gè)新建的對(duì)象,一旦該對(duì)象被分配內(nèi)存話。

在JavaScript中幾乎所有的東西都是一個(gè)對(duì)象,然而常常引起我們興趣的是對(duì)象的constructor。

對(duì)象的構(gòu)造函數(shù)用于創(chuàng)建特定類型的對(duì)象(既要準(zhǔn)備使用對(duì)象,也要接收參數(shù)),構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)可以用來(lái)設(shè)置成員屬性和方法的值。

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

在JavaScript中創(chuàng)建對(duì)象的三種通用方法如下:

// 每種方法將創(chuàng)建一個(gè)空對(duì)象

var newObject = {}

// or

var newObject = Object.create( Object.prototype )

// or

var newObject = new Object();

最后一個(gè)方法實(shí)現(xiàn)對(duì)象的創(chuàng)建可以傳入指定的值,如果沒(méi)有傳遞,將創(chuàng)建一個(gè)空對(duì)象,然后返回它。

傳入String,返回String,類似于new String();
傳入Number,返回Number,類似于new Number();
傳入Object,返回Object,相當(dāng)于沒(méi)傳

為對(duì)象指定鍵和值有如下四種方法:

兼容ES3的方法

// 1. `.`(Dot) 語(yǔ)法
// 設(shè)置屬性
newObject.someKey = "Hello world";
// 獲取屬性
var value = newObject.somekey;


// 2. "[]"方括號(hào)語(yǔ)法
// 設(shè)置屬性
newObject["someKey"] = "Hello World";
// 獲取屬性
var value = newObject["someKey"];

兼容ES5的方法(要了解更多的信息,請(qǐng)轉(zhuǎn) http://kangax.github.com/es5-compat-table/)

// 3. Object.defineProperty
// 設(shè)置屬性
Object.defineProperty(newObject, "someKey", {
    value: "Hello World",
    writable: true,
    enumerable: true,
    configurable: true
})
// 獲取屬性的方法,用1,2中方法即可

// 詳細(xì)了解Object.defineProperty的使用可參考[https://segmentfault.com/a/1190000007434923](https://segmentfault.com/a/1190000007434923)

// 4. Object.defineProperties
// 設(shè)置屬性

Object.defineProperties(newObject, {
    "someKey": {
        value: "Hello World",
        writable: true
    },
    "anotherKey": {
        value: "Ha ha",
        writable: true
    }
})

// 獲取屬性的方法,用1,2中方法即可
對(duì)象的繼承

前面我們說(shuō)到幾種的對(duì)象的創(chuàng)建方式,在三種對(duì)象的創(chuàng)建中,第一種方式最簡(jiǎn)單,效率更高,其他兩種內(nèi)部都用了對(duì)象的繼承,如果沒(méi)有傳入任何參數(shù),實(shí)現(xiàn)和第一種相似。下面試第二三種創(chuàng)建對(duì)象的實(shí)例:

// 第二種
var obj = {};
obj.a=1;
obj.a -> 1
var obj2 = Object.create(obj)
obj2.a -> 1

// 第三種
var obj = {};
obj.a = 1;
obj.a -> 1
var obj2  = new Object(obj);
obj2.a -> 1

所以只是要?jiǎng)?chuàng)建一個(gè)空對(duì)象,第一種方法更好,要實(shí)現(xiàn)對(duì)象的繼承用第二三種方法,第二三種方法的區(qū)別在于前者是ES3,后者是ES5。

// Object.create 的內(nèi)部實(shí)現(xiàn)如下:
Object.create = function(o) {
    function F(){}
    F.prototype=o;
    return new F();
}
constructor 基礎(chǔ)

眾所周知,JavaScript一門不支持 class 這個(gè)概念,但是它支持對(duì)象的構(gòu)造函數(shù),通過(guò)關(guān)鍵字 new 我們想要一個(gè)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象和它用函數(shù)定義的成員。

在constructor的內(nèi)部,this 關(guān)鍵字是被創(chuàng)建的新對(duì)象的引用。重溫對(duì)象的創(chuàng)建過(guò)程,一個(gè)基礎(chǔ)的 constructor 如下所示:

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";
  };
}
 
// 用法:
 
// 創(chuàng)建一個(gè)car的實(shí)例 
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );
 
// 結(jié)果輸出
console.log( civic.toString() ); -> "Honda Civic has done 20000 miles"
console.log( mondeo.toString() ); -> "Ford Mondeo has done 5000 miles"·

如果現(xiàn)在就把它定義為一個(gè)設(shè)計(jì)模式相信,很多人對(duì)不會(huì)用它,因?yàn)樗嬖谥恍﹩?wèn)題。其中一個(gè)就是繼承性,另一個(gè)是每創(chuàng)建一個(gè)對(duì)象實(shí)例,toString() 方法都要被重新定義,理想的實(shí)現(xiàn)方式是要實(shí)現(xiàn) toString() 在不同的實(shí)例類型之間共享。

constructor 和 prototype

在JavaScript中,Function 像其他對(duì)象一樣,有一個(gè) prototype 。當(dāng)我們用contructor創(chuàng)建一個(gè)對(duì)象,所有constructor的 prototype上的屬性都將被新對(duì)象繼承。所以上面的例子我們可以修改如下:

function Car( model, year, miles ) {
    this.model = model;
    this.year = year;
    this.miles = miles;
}

Car.prototype.toString = function () {
    return this.model + " has done " + this.miles + " miles";
};
 
// 用法:
 
// 創(chuàng)建一個(gè)car的實(shí)例 
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );
 
// 結(jié)果輸出
console.log( civic.toString() ); -> "Honda Civic has done 20000 miles"
console.log( mondeo.toString() ); -> "Ford Mondeo has done 5000 miles"·

這樣,toString() 將實(shí)現(xiàn)在不同的對(duì)象實(shí)例間的共享。

其它設(shè)計(jì)模式相關(guān)文章請(qǐng)轉(zhuǎn)‘大處著眼,小處著手’——設(shè)計(jì)模式系列

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/90513.html

相關(guān)文章

  • JS創(chuàng)建對(duì)象模式及其對(duì)象原型鏈探究(五):組合使用構(gòu)造函數(shù)模式和原型模式

    摘要:組合使用構(gòu)造函數(shù)模式和原型模式構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。創(chuàng)建對(duì)象組合使用構(gòu)造函數(shù)模式和原型模式指向構(gòu)造函數(shù),這里要將其恢復(fù)為指向構(gòu)造函數(shù)。另外,這種混合模式,還支持向構(gòu)造函數(shù)傳遞參數(shù)。 組合使用構(gòu)造函數(shù)模式和原型模式 構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。 創(chuàng)建自定義類型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式和原型模式。 ...

    Shimmer 評(píng)論0 收藏0
  • 我來(lái)重新學(xué)習(xí) javascript 的面向?qū)ο螅╬art 2)

    摘要:先來(lái)說(shuō)其實(shí)構(gòu)造函數(shù)也有,原型對(duì)象有,實(shí)例有也有,或者更加籠統(tǒng)的說(shuō),所有對(duì)象都是有的。構(gòu)造函數(shù)的原型對(duì)象上的會(huì)指向構(gòu)造函數(shù)。由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個(gè)提示。 續(xù)上一集內(nèi)容,通過(guò)構(gòu)造函數(shù)的方式,成功地更新了生產(chǎn)技術(shù),老板笑呵呵,工人少奔波,只是問(wèn)題總比辦法多,又遇到一個(gè)新問(wèn)題,就是會(huì)造成一些資源的重復(fù)和浪費(fèi),那么經(jīng)過(guò)工程師們的智慧交流,他們產(chǎn)生了一個(gè)新技...

    silvertheo 評(píng)論0 收藏0
  • 淺析JavaScript中原型及constructor、__proto__、prototype的關(guān)系

    摘要:搞清了構(gòu)造函數(shù)和原型的區(qū)別后,就可以繼續(xù)了。指向構(gòu)造函數(shù)的原型對(duì)象,存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間。要注意的是當(dāng)我們使用下面這種將整個(gè)重寫的情況時(shí),會(huì)切斷構(gòu)造函數(shù)和原型之間的聯(lián)系,也就是說(shuō)不再指向了,而是指向。 前言 先說(shuō)一說(shuō)為什么要搞清楚JavaScript的原型,因?yàn)檫@就是JS的根。JavaScript雖然不是一門傳統(tǒng)的面向?qū)ο笳Z(yǔ)言,但它有自己的類和繼承機(jī)制,最重要的就是它采用...

    wenzi 評(píng)論0 收藏0
  • js知識(shí)梳理3:創(chuàng)建對(duì)象的模式探究

    摘要:起因構(gòu)造函數(shù)對(duì)象字面量都可以用來(lái)創(chuàng)建單個(gè)對(duì)象,但有明顯缺點(diǎn)使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建自定義類型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式與原型模式。 寫在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的作者和譯者。有發(fā)現(xiàn)什么問(wèn)題...

    MrZONT 評(píng)論0 收藏0
  • 《javascript高級(jí)程序設(shè)計(jì)》第六章 讀書筆記 之 javascript對(duì)象的幾種創(chuàng)建方式

    摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對(duì)象的方法和的作用都是在某個(gè)特殊對(duì)象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無(wú)區(qū)別適用情境可以在特殊的情況下用來(lái)為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會(huì)有很多重復(fù)代碼,在此基礎(chǔ)上改進(jìn)showImg(https://segmentfault.com/img/bVbmKxb?w=456&...

    xiaotianyi 評(píng)論0 收藏0
  • 理解js對(duì)象

    摘要:將構(gòu)造函數(shù)的作用域賦值給新對(duì)象因此指向了新對(duì)象執(zhí)行構(gòu)造函數(shù)的代碼為這個(gè)新對(duì)象添加屬性返回對(duì)象最初是用來(lái)標(biāo)識(shí)對(duì)象類型的。但提到檢測(cè)對(duì)象類型,還是使用將構(gòu)造函數(shù)當(dāng)作函數(shù)構(gòu)造函數(shù)與其他函數(shù)唯一區(qū)別。 創(chuàng)建對(duì)象 雖然Object構(gòu)造函數(shù)與對(duì)象字面量都能創(chuàng)建單個(gè)對(duì)象, 但這些方式都有明顯的缺點(diǎn): 使用同一個(gè)接口創(chuàng)建很多對(duì)象, 會(huì)產(chǎn)生大量重復(fù)代碼。 var obj = {}; //對(duì)象字面量 va...

    zhouzhou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<