2012-02-13 12 views
4

質問:
Javascriptの「デフォルト」機能を上書きできますか?Javascriptのデフォルト関数をオーバーライドしますか?

背景:
私はlocalStorageに格納されているオブジェクト間の衝突があったことを考え出すの後、私は私が衝突を避けるために、すべてのキーにプレフィックスを適用すべきであると決定しました。明らかに、私はラッパー関数を作成することができましたが、デフォルト値をオーバーライドして、プレフィックスを考慮に入れて直接行うことができます。

私の例題は、再帰的に自分自身を呼び出すので、Firefoxを完全に終了させるので、明らかに解決策には近づきません。おそらくそれは私が達成したいものを明確にします。

コード:

Storage.prototype.setItem = function(key, value) { 
    this.setItem("prefix"+key, value); 
}; 

Storage.prototype.getItem = function(key, value) { 
    return this.getItem("prefix"+key); 
}; 

答えて

10

あなたは古い機能を格納する必要があります。

Storage.prototype._setItem = Storage.prototype.setItem; 
Storage.prototype.setItem = function(key, value) { 
    this._setItem("prefix" + key, value); 
}; 

Storage.prototype._getItem = Storage.prototype.getItem; 
Storage.prototype.getItem = function(key) { 
    return this._getItem("prefix" + key); 
}; 

そうでない場合は、ブラウザをクラッシュ、スタックオーバーフローが生じ、反復ごとにスタック領域を消費する無限ループを得る:)

+5

+1スタックオーバーフロー..無限ループではありません –

+0

その両方:)スタックオーバーフローの原因となる無限再帰!無限再帰を伴わずにスタックオーバーフローを起こす可能性があります。P – caleb

+0

はい、そうです。しかし、来る。これは、スタックオーバーフローのために失敗します。それは無限ループでした、JSエラーを生成しませんでした。 –

0

正常です、あなたは無限再帰を行います。 Storage.prototype.setItemで、Storage.prototype.setItemを参照するthis.setItemを呼び出します。

Storage.prototype.getItemと同じです。

2

また、古いストレージの機能を保持するための新しい変数を作成する代わりに、そうした関数をいつでもバインドすることができます。

Storage.prototype.setItem = (function(key, value) { 
    this.call(localStorage,"prefix" + key, value); 
}).bind(Storage.prototype.setItem); 

Storage.prototype.getItem = (function(key) { 
    return this.call(localStorage,"prefix" + key); 
}).bind(Storage.prototype.getItem); 

そして、あなたは、コンソールだけでなく、あまり雑然としたコードで検査時にネイティブコードとして新しい機能を表すの利点を得ます。

+0

これは、これは私が欲しいものです元に戻すことができないように見えるため、あなたの答えを使用しました。本当? – StarQuake

+0

私の知る限り、それはできません。 –

関連する問題