2011-12-12 23 views
0

這個問題很簡單。就像在PHP中,我們有魔術功能__construct(),有什麼相關的功能或黑客我可以在JavaScript中使用?Javascript:是否有可能在創建對象/字符串時自動觸發一個函數?

例子:

function setLength() { 
    /* Some work */ 
} 

var a = new Object(); 
b = new String("Hello"); 
//Is there anyway the function setLength() will automatically be fired when an Object or String... created? 

我很期待你的答案。非常感謝您的幫助。

[X]

回答

2

試圖超載String將是一個壞主意,特別是如果與第三方庫的工作。這同樣適用於擴充Object

然而,這裏是你可以怎麼做,但我不建議這樣做..

var _String = String; 

window.String = function() { 
     setLength(); 
     return new _String(arguments[0]); 
} 

這顯然創造了原始的字符串時也不會被調用。

jsFiddle


你可以使用一個串工廠函數返回一個新String對象,並調用你的函數。

var stringFactory = function(chars) { 
    setLength(); 
    return new String(chars); 
} 

這有一些好處,主要是String構造函數沒有被重載。

+1

+1,用於stringfactory。但是,我不認爲第一部分是一個真正可行的方法。但是,即使如此,我會建議使用閉包來避免創建'_String'全局變量,比如'window.String =(function(){var _String = String; setLength(); return new _String(arguments [0]); })();' – smartcaveman

+0

謝謝Alex,這直到現在一直是最完美的解決方案。如果可以的話,我儘量避免。所以基本上當我們複製/克隆String構造函數並將其分配給另一個變量然後重用它時,它會產生不好的效果嗎?[x] – xx3004

0

您可以覆蓋 string.prototype.constructor以更改字符串構造函數的默認功能,並更改 object.prototype.constructor以更改對象構造函數的默認功能。

但是,覆蓋JavaScript核心類的默認功能被廣泛認爲是不好的做法,並且可能有更好的方法來實現您的最終目標。 如果你決定這樣做,你也可以通過閱讀以下SO郵政瞭解重寫函數引用重寫功能的功能中受益:Overriding a JavaScript function while referencing the original

用的jsfiddle亂搞,然後做一些研究之後。我發現我其實是錯的。字符串原語是不可變的,所以你不能重寫構造函數,就像我建議的那樣。查看String prototype modifying itself,瞭解更多信息。

+0

我在考慮不會替換整個String構造,而是向其中注入一些代碼,例如在創建String時知道哪些函數被激活,那麼我們只能覆蓋該函數。可能嗎?開發人員是否有解決這個問題的方法?我只是好奇。 [x] – xx3004

+0

你將如何通過修改'constructor'屬性來實現這一點? – alex

+0

@ xx3004,似乎沒有辦法做你所描述的。你最好的選擇是使用一致的'stringFactory'模式來創建字符串,就像@ alex的例子 – smartcaveman

1

你可以通過做這樣的事情來創建自己的對象。該函數充當構造函數:

$(document).ready(function(){ 

    var instance = new object('test123'); 

    alert('Instance: '+instance.len); 

    function object(var1){ 
     this.var1 = var1; 

     this.len = this.var1.length; 
    } 
}); 
+0

嗨。這是一個很好的方式,我想過它,但我想將這些函數添加到本地對象,而不是創建一個新的。 [X] – xx3004

相關問題