2011-03-07 106 views
1

比方說,我有一個JavaScript對象...需要幫助延伸的JavaScript對象

app.dooDad = {} 
(function (O) { 

    O.magicStuff = function() { 

     alert("LOL!"); 

    } 

    ...other methods... 

})(app.doodad) 

現在,讓我們說我有這樣的對象的深層副本...

app.specialDooDad = jQuery.extend(true, {}, app.dooDad); 
(function (O) { 

    O.magicStuff = function() { 

     alert("LOL!"); 
     alert("Cats!"); 

    } 

})(app.doodad) 

我想知道: 有一個更好的方法嗎?也就是說,有沒有更好的方法來用specialDooDad中的附加命令擴展magicStuff方法,而不用重寫呢?

感謝(提前)的幫助。

+0

您無法擴展功能,從而無法爲其添加更多命令。 – 2011-03-07 19:09:19

回答

1

糾正我,如果我錯了,但我相信你可以做這樣的事情在Javascript:

app.specialDooDad = jQuery.extend(true, {}, app.dooDad); 
(function (O) { 

    O.oldMagicStuff = O.magicStuff; 

    O.magicStuff = function() { 

     //Additional stuff you want to do 
     alert("Cats!"); 
     O.oldMagicStuff(); 

    } 

})(app.doodad) 

這只是工作得很好,如果你只是增加一個額外的兩件事,之前或在「原始」功能運行後。如果你需要在中間添加東西,我相信你只需要重寫這個函數。

我假設你想要這樣做來保持與現有代碼庫(如開源庫)的向後兼容性?

+0

感謝您的迴應。實際上,我只是試圖找出將對象從常規擴展到更專用於我自己的小應用程序的最佳方式,而不必在此過程中重寫太多代碼。也許有更好的方法去做 - 我對這個東西有點新。 :) – 2011-03-07 19:21:44

+0

克隆真的不會做任何你知道的事情。 – Raynos 2011-03-07 19:30:14

+0

@Raynos正如我所說,糾正我,如果我錯了:-)。你如何得到它來創建一個新的函數副本並存儲它? – 2011-03-07 19:30:56

0
function DooDad() { 
    this.magicStuff = function() { 
     alert("LOL!"); 
    } 
} 

app.dooDad = new ConstructorA(); 

function SpecialDooDad() { 
    var o = new DooDad; 

    this.magicStuff = function() { 
     o.magicStuff.apply(this, arguments); 
     alert("Cats!"); 
    } 

} 

app.specialDooDad = new SpecialDooDad; 

我更喜歡這種擴展方式。它更實用。您可以通過構圖和擴展來創建新對象。