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

資訊專欄INFORMATION COLUMN

細(xì)說 Javascript 函數(shù)篇(五) : ?構(gòu)造函數(shù)

sPeng / 3019人閱讀

Javascript 中的構(gòu)造函數(shù)與其他語言相比也是不同的。任何通過關(guān)鍵字 new 調(diào)用的函數(shù)都可以當(dāng)做構(gòu)造函數(shù)。
在構(gòu)造函數(shù)體內(nèi),this 指向新創(chuàng)建的對象。如果構(gòu)造函數(shù)體內(nèi)沒有顯示的 return 表達(dá)式,那么我們就默認(rèn)返回 this,也就是新建的對象。

function Foo() {
    this.bla = 1;
}

Foo.prototype.test = function() {
    console.log(this.bla);
};

var test = new Foo();

上面的代碼將 Foo 作為構(gòu)造函數(shù)進(jìn)行調(diào)用,并將新建對象的原型(__proto__)指向了 Foo.prototype。
如果我們在構(gòu)造函數(shù)內(nèi)定義返回的 return 表達(dá)式,構(gòu)造函數(shù)就會返回整個(gè)表達(dá)式,但這個(gè)返回表達(dá)式必須為一個(gè)對象。

function Bar() {
    return 2;
}
new Bar(); // a new object

function Test() {
    this.value = 2;

    return {
        foo: 1
    };
}
new Test(); // the returned object

如果 new 被省略,那么函數(shù)將不能返回一個(gè)新的對象。

function Foo() {
    this.bla = 1; // gets set on the global object
}
Foo(); // undefined

上面的例子可能在某些場景下也可以運(yùn)行,但由于 Javascriptthis 的工作機(jī)制,這里 this 將指向全局對象。

工廠模式

為了能夠不使用關(guān)鍵字 new,構(gòu)造函數(shù)將不得不顯示返回一個(gè)值。

function Bar() {
    var value = 1;
    return {
        method: function() {
            return value;
        }
    }
}
Bar.prototype = {
    foo: function() {}
};

new Bar();
Bar();

上例中使不使用 new 來調(diào)用函數(shù) Bar 達(dá)到的效果是一樣的,將會返回一個(gè)新建的包含 method 方法的對象,這里實(shí)際上就是一個(gè)閉包。
這里需要注意一點(diǎn),new Bar() 將不會返回 Bar.prototype,而是在 return 表達(dá)式內(nèi)函數(shù) method 的原型對象。
上例中,使用 new 與否在功能上是無差異的。

通過工廠模式創(chuàng)建新的對象

我們經(jīng)常被提醒不要使用 new,因?yàn)橐坏┩浟怂氖褂脤?dǎo)致錯(cuò)誤。
為了創(chuàng)建一個(gè)對象,我們更愿意使用工廠模式并在工廠模式內(nèi)構(gòu)造一個(gè)新的對象。

function Foo() {
    var obj = {};
    obj.value = "blub";

    var private = 2;
    obj.someMethod = function(value) {
        this.value = value;
    }

    obj.getPrivate = function() {
        return private;
    }
    return obj;
}

盡管上例代碼比使用 new 時(shí)更不容易出錯(cuò),而且在使用私有變量時(shí)將更加方便,但同時(shí)也有一些不好的地方:

因?yàn)椴荒芄蚕碓蛯ο螅孕枰嗟膬?nèi)存。

為了實(shí)現(xiàn)繼承,工廠模式需要拷貝另一個(gè)對象的所有方法或者將其作為新對象的原型。

放棄原型鏈只是為了避免使用 new,這似乎與 Javascript 語言的精神相悖。

總結(jié)

盡管使用 new 可能比較容易產(chǎn)生錯(cuò)誤,但這并不能成為放棄使用原型鏈的原因。至于最后采取哪種方式,這需要根據(jù)應(yīng)用的需求而定。最好的方式就是選擇一種風(fēng)格并堅(jiān)持下去。

參考

http://bonsaiden.github.io/JavaScript-Garden/#function.constructors

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

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

相關(guān)文章

  • 細(xì)說 Javascript 函數(shù)(二) : this 的工作機(jī)制

    摘要:與其他編程語言相比,對的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對象。此時(shí)在函數(shù)內(nèi),指向新建的對象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...

    ZoomQuiet 評論0 收藏0
  • 細(xì)說 Javascript 對象(二) : 原型對象

    摘要:并沒有類繼承模型,而是使用原型對象進(jìn)行原型式繼承。我們舉例說明原型鏈查找機(jī)制當(dāng)訪問一個(gè)對象的屬性時(shí),會從對象本身開始往上遍歷整個(gè)原型鏈,直到找到對應(yīng)屬性為止。原始類型有以下五種型。此外,試圖查找一個(gè)不存在屬性時(shí)將會遍歷整個(gè)原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進(jìn)行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然...

    lansheng228 評論0 收藏0
  • 細(xì)說 Javascript 數(shù)組(二) : 數(shù)組的構(gòu)造函數(shù)和常見操作

    摘要:數(shù)組的構(gòu)造函數(shù)由于數(shù)組的構(gòu)造函數(shù)在處理參數(shù)時(shí)的不確定性,因此強(qiáng)烈建議使用符號來創(chuàng)建一個(gè)新數(shù)組??偨Y(jié)綜上所述,我們應(yīng)該盡量使用來創(chuàng)建新函數(shù),而不是數(shù)組的構(gòu)造函數(shù),這樣代碼將有更好的可讀性。 數(shù)組的構(gòu)造函數(shù) 由于數(shù)組的構(gòu)造函數(shù)在處理參數(shù)時(shí)的不確定性,因此強(qiáng)烈建議使用 [] 符號來創(chuàng)建一個(gè)新數(shù)組。 [1, 2, 3]; // Result: [1, 2, 3] new Array(1, ...

    kaka 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<