2012-10-02 11 views
6

を削除せずに機能をオーバーライドは、静的プロパティ

a.static = 'foo'; 

しかし、私はとの関数をオーバーライドしたいと言いますこのような別の関数:

var old = a; 

a = function() { 
    console.log('new'); 
    old.call(this); 
}; 

a.static // undefined 

私はaに新しい機能が割り当てられているので、静的なプロパティが失われます。ループせずに静的なプロパティを保持し、手動でそれらをコピーするためのきちんとした方法はありますか?

更新:

ここで現実の世界のシナリオだ。だから私は、「拡張」をしたい場合は

$.fn.modal = function() { 
    // some code 
}; 

$.fn.modal.defaults = { // some object }; 

:ブートストラップjQueryのプラグインでは、著者はこのようなプロパティ関数にデフォルト値を割り当て、私は通常どうなるのプロトタイプ:

var old = $.fn.modal; 

$.fn.modal = function() { 
    // do my thing 
    old.apply(this, arguments); 
} 

しかし、それは

になるだろう

デフォルトを失うため、機能が無効になります。私は静的なプロパティを失うことなく、の機能だけをに変更するためにjavascriptに卑劣な方法があるかどうか疑問に思っていました。

+1

このようなアプローチの使用方法を聞かせてもよろしいですか?それは本当に乱雑に見えます。 – Christoph

+0

私は、ブートストラップのjQueryプラグインで、著者がプロトタイプに添付されたオブジェクトとして静的なデフォルトを割り当てるため、尋ねています。だから、もし私がそれを拡張したいのであれば、私はデフォルトのもの(およびおそらく他のプロパティ)を失います。また、関数を変更する方法があるのか​​不思議ですので、静的なプロパティではありません。 – David

答えて

3

いいえ、できません。オブジェクト(関数)の置き換えは、常にそのプロパティで行います。

ここには2つの解決策があり、どちらも古いオブジェクトから新しいオブジェクトにプロパティを転送することです。

最初(推奨)アプローチは$.extendで便利に行うことができるプロパティを、コピーすることです:

$.fn.plugin = $.extend(function() { ... }, $.fn.plugin); 

目のオプションは、動的に古い関数と新しい関数のプロトタイプを設定することです。例えば、一部のブラウザでは、これは動作します:

var f = function() { ... }; 
f.__proto__ = $.fn.plugin; 
$.fn.plugin = f; 

しかし、これは非標準であり、合併症を生じさせる可能性があります。それをしないでください。

+0

私は '$ .extend'を関数のプロパティをコピーする方法とは考えていませんでしたが、うまくいきます。ありがとう – David

関連する問題