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)行,但由于 Javascript 中 this 的工作機(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 與否在功能上是無差異的。
我們經(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
摘要:與其他編程語言相比,對的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對象。此時(shí)在函數(shù)內(nèi),指向新建的對象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...
摘要:并沒有類繼承模型,而是使用原型對象進(jìn)行原型式繼承。我們舉例說明原型鏈查找機(jī)制當(dāng)訪問一個(gè)對象的屬性時(shí),會從對象本身開始往上遍歷整個(gè)原型鏈,直到找到對應(yīng)屬性為止。原始類型有以下五種型。此外,試圖查找一個(gè)不存在屬性時(shí)將會遍歷整個(gè)原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進(jìn)行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然...
摘要:數(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, ...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 2857·2021-11-23 09:51
閱讀 2476·2021-09-30 09:48
閱讀 2125·2021-09-22 15:24
閱讀 1085·2021-09-06 15:02
閱讀 3437·2021-08-17 10:14
閱讀 2009·2021-07-30 18:50
閱讀 2039·2019-08-30 15:53
閱讀 3259·2019-08-29 18:43