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 表達式,那么我們就默認返回 this,也就是新建的對象。
function Foo() { this.bla = 1; } Foo.prototype.test = function() { console.log(this.bla); }; var test = new Foo();
上面的代碼將 Foo 作為構(gòu)造函數(shù)進行調(diào)用,并將新建對象的原型(__proto__)指向了 Foo.prototype。
如果我們在構(gòu)造函數(shù)內(nèi)定義返回的 return 表達式,構(gòu)造函數(shù)就會返回整個表達式,但這個返回表達式必須為一個對象。
function Bar() { return 2; } new Bar(); // a new object function Test() { this.value = 2; return { foo: 1 }; } new Test(); // the returned object
如果 new 被省略,那么函數(shù)將不能返回一個新的對象。
function Foo() { this.bla = 1; // gets set on the global object } Foo(); // undefined
上面的例子可能在某些場景下也可以運行,但由于 Javascript 中 this 的工作機制,這里 this 將指向全局對象。
工廠模式為了能夠不使用關(guān)鍵字 new,構(gòu)造函數(shù)將不得不顯示返回一個值。
function Bar() { var value = 1; return { method: function() { return value; } } } Bar.prototype = { foo: function() {} }; new Bar(); Bar();
上例中使不使用 new 來調(diào)用函數(shù) Bar 達到的效果是一樣的,將會返回一個新建的包含 method 方法的對象,這里實際上就是一個閉包。
這里需要注意一點,new Bar() 將不會返回 Bar.prototype,而是在 return 表達式內(nèi)函數(shù) method 的原型對象。
上例中,使用 new 與否在功能上是無差異的。
我們經(jīng)常被提醒不要使用 new,因為一旦忘記了它的使用將導(dǎo)致錯誤。
為了創(chuàng)建一個對象,我們更愿意使用工廠模式并在工廠模式內(nèi)構(gòu)造一個新的對象。
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 時更不容易出錯,而且在使用私有變量時將更加方便,但同時也有一些不好的地方:
因為不能共享原型對象,所以需要更多的內(nèi)存。
為了實現(xiàn)繼承,工廠模式需要拷貝另一個對象的所有方法或者將其作為新對象的原型。
放棄原型鏈只是為了避免使用 new,這似乎與 Javascript 語言的精神相悖。
總結(jié)盡管使用 new 可能比較容易產(chǎn)生錯誤,但這并不能成為放棄使用原型鏈的原因。至于最后采取哪種方式,這需要根據(jù)應(yīng)用的需求而定。最好的方式就是選擇一種風(fēng)格并堅持下去。
參考http://bonsaiden.github.io/JavaScript-Garden/#function.constructors
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78075.html
摘要:與其他編程語言相比,對的使用是一套完全不同的機制。在五種情況下的值是各有不同的。調(diào)用一個函數(shù)時在這里,同樣指向全局對象。此時在函數(shù)內(nèi),指向新建的對象。盡管,晚綁定初看上去是個不好的決定,但實際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...
摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當(dāng)訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應(yīng)屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個缺點,然...
摘要:數(shù)組的構(gòu)造函數(shù)由于數(shù)組的構(gòu)造函數(shù)在處理參數(shù)時的不確定性,因此強烈建議使用符號來創(chuàng)建一個新數(shù)組。總結(jié)綜上所述,我們應(yīng)該盡量使用來創(chuàng)建新函數(shù),而不是數(shù)組的構(gòu)造函數(shù),這樣代碼將有更好的可讀性。 數(shù)組的構(gòu)造函數(shù) 由于數(shù)組的構(gòu)造函數(shù)在處理參數(shù)時的不確定性,因此強烈建議使用 [] 符號來創(chuàng)建一個新數(shù)組。 [1, 2, 3]; // Result: [1, 2, 3] new Array(1, ...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 2684·2021-11-23 09:51
閱讀 2427·2021-09-30 09:48
閱讀 2060·2021-09-22 15:24
閱讀 1024·2021-09-06 15:02
閱讀 3333·2021-08-17 10:14
閱讀 1956·2021-07-30 18:50
閱讀 1992·2019-08-30 15:53
閱讀 3192·2019-08-29 18:43