2017-11-22 10 views
0

私は伝統JavaScriptで単純なオブジェクトとコンストラクタを持っている:オブジェクト内のJavaScriptを次のように内部オブジェクトのためのセッター

function Test() { 
    this.data={}; 
} 
Test.prototype={ 
    set value(something) { 

    }, 
    get value() { 
     return data[property]; 
    } 
}; 

var test=new Test(); 

には、最初は独自のプロパティを持つ、他の目的です。

内側オブジェクト(data)のプロパティを設定するvalueのセッターを書いてみたいと思います。

test.value.whatever=23; 

私はこれを行う方法はありますか?

私はセッター関数は、このようなもので仕事を終えることができることを期待し:ここで

set value() { 
     // how do I get property & value? 
     data[property]=value; 
    }, 
+0

は' .value'セッターを呼び出していません、いいえ。 – Bergi

+0

なぜこれをやりたいのですか?あなたは '.value'とオブジェクトを' .whatever'セッターで作ることもできますし、プロキシを使ってすべてのアクセスをキャッチすることもできますが、あなたの[実際の問題](https://meta.stackexchange.com)/q/66377)。 – Bergi

+0

@Bergi 'NodeList'に似た、いくつかの要素を含む単純な配列のようなオブジェクトを開発しています。私は単一の要素でそれらを実行するのと同様の形式を使用して、このオブジェクトのいくつかの操作を実行したいと思います。私は 'elements.innerHTML'を簡単に実装できますが、' elements.style'にはいくつかのネストが必要です。私は 'elements.style(property [、value])'を使うことができることを知っていますが、私は単一の要素の操作をミラーリングしたいと思います。私には別の解決策がありますが、Getters&Settersの使い方についてもっと学びたいと思います。 – Manngo

答えて

0

あなたは

function Test() { 
    this.data = {}; 
} 
Test.prototype={ 
    set value(v) { 
     this.data.whatever = v; 
    }, 
    get value() { 
     return this.data.whatever; 
    } 
}; 
var test = new Test(); 
test.value = 'hi'; 
console.log(test.value) // 'hi' 
console.log(test.data) // {whatever: 'hi'} 

はコンストラクタでdataプロパティを置くことを忘れないでください行きます。それ以外の場合は、プロトタイプに入れると、すべてのインスタンス間で共有プロパティになります。

+0

良い点。私はその問題を修正した。ありがとう – Manngo

+0

@Manngo私の解決策はあなたの質問を解決しませんでしたか? – damianmr

+0

いいえ、オブジェクトの_arbitrary_プロパティを_inside_オブジェクトに設定する方法を知りたかったのです。これが 'data'オブジェクトです。 – Manngo

0

私は答えを持っています:@Bergi & @ damianmrで提案されているように、私はProxyオブジェクトを使っていました。あなたが見ることができるように

function Test() { 
    this.dataStore={}; 
    this.data=new Proxy(this,{ 
     set(target,property,value) { 
      target.dataStore[property]=value; 
     }, 
     get(target,property) { 
      return target.dataStore[property]; 
     } 
    }); 
} 
Test.prototype={ 

}; 

var test=new Test(); 
test.data.whatever=23; 
test.data.etc=46; 

alert(`${test.data.whatever} ${test.data.etc}`); 

:ここ

は作業バージョンです

  • 私は、オブジェクトがdataStoreと呼ばれ、プロキシはプロキシはコンストラクタで設定されているdata
  • と呼ばれてい

これは簡単な抽象化であり、それは私が取り組んでいるより複雑なプロジェクトにも役立ちます。

唯一の欠点は、IEがProxyをサポートしていないことです。私が見たpolyfillは新しいプロパティが気に入らないということです。 `test.value`オブジェクトのプロパティを設定するだけで、私はレガシーのブラウザのための機能の代替を提供する必要があり、それらが出て死ぬのを待つことを意味します

...

+0

もちろん、この単純な例では、プロキシは 'this.data = this.dataStore'もやっていないことを何もしません:-) – Bergi

関連する問題