2017-09-20 4 views
1

こんにちは、私はsessionStorageのようなもののための適切なラッパーを書く方法が不思議です。sessionStorageのようなものに対して適切なES6ラッパーを書く方法

sessionStorageへのメソッド呼び出しによって、自分自身とプロキシのクラスを実装できます。いくつかの簡単な擬似コードでたとえば:

class customStorage { 
    set(key, value) { 
     sessionStorage.setItem(key, value); 
    } 
} 

私はそうのようにそれを使用します。

const customStorage = new customStorage(); 
customStorage.set('my-key', 'hello there'); 

すべての罰金とダンディが、私は上の他のネイティブsessionStorageの方法を使用する自由を持っているユーザーのための希望します私のプロキシは自分のプロキシで自分自身を実装していない可能性があります。

sessionStorageのようなものは、自分で書き込むことができますが、何もしなくても、何もしなくてもsessionStorageにプロキシされます。

私が20のうち5つの方法しか操作しない場合は、これは実行可能なように見えます。

プロトタイプでネイティブ機能を上書きすることは、多くの場合wtfs-per-minuteにつながる死のように思えます。

これまでJavascriptの「プロキシパターン」から読み込んだものは、すべて元のオブジェクトのすべてのメソッドを実装していました。私はこれを強制するのですか?

ES6クラスを作成し、そのクラスのプロトタイプをコンストラクタなどでsessionStorageに設定する方法はありますか?

+1

あなたは "* *適切なラッパー" とはどういう意味ですか?ラッパーは何を達成するはずですか?なぜ、 'sessionStorage'の代わりにラッパーを直接使うのでしょうか? – Bergi

+0

一部のメソッドのすべての機能を実装せずに、デフォルトの機能を変更する。たとえば、 'JSON'オブジェクトを90%使って作業しているので、' set'または 'get'を実行すると、データを設定または取得するために' stringify'や 'parse'を行いたいと思います。そして、「適切な」とは、ES6クラスのような多くの機能がコードに多くの可読性を追加するので、私は好ましくはES6でクリーンなアプローチを意味します。 –

+0

ああ、あなたはその質問を明確にしておくべきです。 – Bergi

答えて

2

他のネイティブのsessionStorageメソッドを私のプロキシで自由に使用して、プロキシで自分自身を実装できないようにしたいと考えています。

私はむしろ、彼はそれをするつもりであれば、単にネイティブsessionStorage直接を使用するユーザーに自由を与えるだろう。実装には独自の機能があり、内部でsessionStorageを使用しますが、sessionStorageではありません。オブジェクトにインターフェイスを実装する理由はありません。 (composition over inheritanceも参照してください)。

ES6 classを作成し、コンストラクタか何かでsessionStorageに、非常にクラスのプロトタイプを設定する方法のいくつかの並べ替えはありますか?

いいえ。そのインターフェイスを実装する場合でも、オブジェクトは実際にはSessionStorageインスタンスではありません。この特定のケースでは、sessionStorageはシングルトンであり、2番目にSessionStorageをインスタンス化できないため、継承はここでは絶対に機能しません。

  • この周りには3つの方法があります(ラップする、私は任意のオブジェクトのインスタンス化と一般的なケースのためのコードを記述しますが、あなたはおそらく、あなたの独自のストレージのための静的なシングルトンのようなものをしたいです)

    オブジェクトを装飾するミックスイン。別のインスタンスを作成せず、元のプロパティを上書きするだけです。物体の反射を使用して完全なラッパーを作成し、寄生継承

    function custom(orig) { 
        orig.get = function() { … }; 
        return orig; 
    } 
    
  • (これは、組み込みオブジェクトの問題のうちの可能性があります)。 suitable handler

    function custom(orig) { 
        const obj = { 
         get() { … }; 
        }; 
        for (const p in orig) { // assuming everything is enumerable - alternatively use 
              // for (const p of Object.getOwnPropertyNames(…)) 
              // or even incorporating the prototype chain 
         obj[p] = typeof orig[p] == "function" 
          ? (...args) => orig[p](...args) 
          : orig[p]; 
        } 
        return obj; 
    } 
    
  • リテラルProxy

    const customMethods = { 
        get() { … } 
    }; 
    const handler = { 
        has(target, name) { 
         return name in customMethods || name in target; 
        }, 
        get(target, name) { 
         if (name in customMethods) return customMethods[name]; 
         else return target[name]; 
         // if its a native object with methods that rely on `this`, you'll need to 
         // return target[name].bind(target) 
         // for function properties 
        } 
    } 
    
    function custom(orig) { 
        return new Proxy(orig, handler); 
    } 
    
+0

あなたの答えをありがとう、私はそれが私が探しているものに本当に近くになると思われる3番目を試してみます。とても有難い! –

+0

途中で 'has'ハンドラが必要なのはなぜですか?この例はそれがなくてもうまく動作し、 'in'演算子は' customMethods'をチェックしています。存在しない場合はネイティブオブジェクトに代わってプロキシします。これは私のためにうまくいくようですか? https://jsfiddle.net/pouk8rya/ –

+0

@ Stephan-v 'in'ハンドラは、プロキシで' in'演算子が使われたときに呼び出されます。元のオブジェクトにないカスタムキーを持っていれば問題ありません。他のプロキシハンドラをチェックアウトして、カスタムビヘイビアが必要なものがあるかどうかを確認する必要があります。列挙。 – Bergi

関連する問題