2017-10-30 17 views
0

私の簡単な例:プロパティ名を文字列として取得する方法は?

let a = { foo : 5}, b = { stuff : 7}; 
let func = function(obj, prop) { ++obj[prop]; } 
func(a, 'foo'); 
func(b, 'stuff'); 

私は直接リテラル文字列としてプロパティ名を設定funcを呼び出します。遅く(私のコードソースで)プロパティの名前を変更したい場合、文字列リテラルも変更する必要があります。文字列値をリテラルとして使用する代わりに、実行時にプロパティ名を文字列として取得することは可能ですか?

UPD私のプロジェクトで

(明確にするため)、私はいくつかのクラスを持っているそれらのそれぞれは、配列を含むプロパティがあります。しかし、このプロパティは各クラスの名前が異なります。これらの配列の内容を処理するロジックがあります。このロジックは各クラスで同じです。今はプロパティ名を文字列リテラルとして渡しますが、後でコードソースでこれらのプロパティの名前を変更すると、文字列リテラルも変更する必要があります。もし私がそれをするのを忘れると、私は問題を抱えます。ですから、私はこの作業で文字列リテラルの使用を取り除きたいと思っています。

+0

あなたは常に単一のプロパティと関数にオブジェクトを渡しますか?その場合、それは簡単だろう。そうでなければ...どのようなプロパティが正しいプロパティを使用するかを関数がどのように知ることができますか? – Touffy

+0

*>それは簡単でしょう。* ? *>どのようなプロパティが適切なプロパティであるかを関数が知ることができますか?* プロパティ名で指定します。 –

+0

ええ、あなたはその物件の名前を変更することができると言った。 2つのプロパティとプロパティ名を持たないオブジェクトを渡すと、どのプロパティがどのプロパティをインクリメントするのかが分かりますか? – Touffy

答えて

1

あなたがしようとしていることは悪い考えです。異なるオブジェクトで何かが同じように動作する場合は、同じ名前を使用します。しかし、ねえ、そのためのES6コンセプトがあります!

シンボルはJavaScriptによって、異なる「クラス」で同様の動作をサポートするために使用されます。だからここでそれをやろう。

のは、シンボルを作成してみましょう:

const incrementableProp = Symbol("incrementableProp") 

まずは、行動を持っている必要があり、あなたのオブジェクトのプロパティの名前を格納してみましょう:

const a = { 
    specialProp: [], 
    [incrementableProp]: "specialProp" 
} 

シンボル自体は常に同じになり、インクリメント機能で確実に見つけることができます:

function incrementProp(obj) { 
    if(incrementableProp in obj) 
     obj[obj[incrementableProp]]++ 
    else throw new TypeError("This object does not support an incremental property.") 
} 

最後に、オブジェクト内のシンボル定義を削除して、名前を1回だけ変更する必要があります。だから今、あなたがこれを行うことができます

function special(target, key, descriptor) { 
    target[incrementableProp] = key 
    return descriptor 
} 

::私たちは、そのためのデコレータを使用します

const a = { 
    @special specialProp: [] 
} 
+0

私はそれを知っています。私の場合はどうすれば助けになるのですか? –

+0

オブジェクトに単一のプロパティがある場合は、関数の名前を渡す必要なしにインクリメントされます。したがって、オブジェクトに単一のプロパティがある場合は、これが問題を解決します。 – Touffy

+0

** UPD **セクションを追加しました。私は質問の記述がより明確になることを希望しています。 –