2016-11-14 3 views
0

を編集します。私が以下の処理を行っているのは、getter/setterへの参照を辞書に格納できる理由です。これにより、辞書のキーをHTML要素のIDにすることができます。このように、プロパティがHTMLに変更された場合、私はのような何かを行うことができます。継承が継承されるときにES6 Javascriptクラスのgetter/setterを格納する

var propData = allMyGetterSetters[e.originalTarget.id]; 
propData.getSet.set(propData.obj, e.originalTarget.value); 

をまた、これは私がループを行うと、すべてのHTMLを更新することができ、私のロジックがそれを変更する必要があります。


クラスのいくつかのプロパティのゲッター/セッターへの参照を格納する必要があります。私はこれを数回行う必要があるため、私は次のメソッドを持って、簡単にするために

Object.getOwnPropertyDescriptor(Object.getPrototypeOf(myClassObj.position), "x"); 

:私は、次のコードでこれを行うことができた

_makeGetSetObj(object, property){ 
    return { 
     getSet: Object.getOwnPropertyDescriptor(Object.getPrototypeOf(object), property), 
     obj: object 
    }; 
} 

、後続のコードでは、になりますこのように:

var xPos = this._makeGetSetObj(myClassObj.position, "x"); 
// ... 
xPos.getSet.get(xPos.obj); 

これは完全に機能します。

はしかし、私は今、私のmyclassObjオブジェクトのゲッター/セッターへの参照を格納する必要があります。ただし、以下ではこれは実際に私にnameがオブジェクトに存在しないというエラーを出します

this._makeGetSetObj(myClassObj, "name"); 

を動作しません。私はこの問題は、問題がmyClassObjことのようです。この

|-- BaseClass 
    |-- MyClass 
    |-- DerivedClass 

ようになり、私の継承であり、実際のプロパティnameを持たないタイプDerivedClassの対象であることを把握するために管理してきましたそれ。

だから、私が行う場合は、この:

this._makeGetSetObj(myClassObj.__proto__, "name"); 

それはプロトタイプを得るために動作しますが、(私のxPos例で)上記のように、私はそれを使用しようとすると、まだのようですので、それが失敗しましたDerivedClassオブジェクトとしてobj内の参照を格納します。私は私の方法の外に引っ張ると、手動で物事をしようとした場合

、これは動作します:

var name = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(myClassObj.__proto__), "name"); 
name.get(myClassObj); 

他の部分はそうではない一部が__proto__を必要とする。これは明らかに、しかし私の方法を破ります。

だから、私の質問は:私の現在のロジックを維持する方法はありますか、私が説明した問題と場所のための特別なメソッドを作成する必要がありますか?

ありがとうございました。

+0

「ゲッター/セッターへのハンドルの保存」とはどういう意味ですか?どのような問題を解決しようとしていますか? – jfriend00

+0

@ jfriend00コードスニペットに表示されている内容だけです。おそらく "参照"はより良い言葉でしたか? – David

+0

それは動作するようです。このフィーを試してみてくださいhttps://jsfiddle.net/pcrfuuc9/ –

答えて

2

ハードコードされたプロトタイプは良い香りがしません。プロトタイプチェーンは常に反復する必要があります。

let proto = obj; 
let descriptor; 
do { 
    descriptor = Object.getOwnPropertyDescriptor(proto, prop); 
} while (!descriptor && proto = Object.getPrototypeOf(proto)) 
... 

この機能はすでにReflectによって実装されています。代わりに、手動で記述子を解析するこれはアクセサが直接呼び出されたときに何が起こるかあるので、それは

const getSet = { 
    get:() => Reflect.get(obj, prop), 
    set: (val) => { Reflect.set(obj, prop, val) } 
}; 

それとも...ただ

const getSet = { 
    get:() => obj[prop], 
    set: (val) => { obj[prop] = val } 
}; 

かもしれません。

+0

うわー、それは私がやっていたよりもはるかにクリーンです!今私は少し迷惑をかけるので、私はこれを行う方法を研究しているときに「Reflect」を使うことについて何も見つけられませんでした。副次的な理由として、私が反復していない理由は、すべてのプロパティを必要としないためです。いくつかはコードでのみ使用されることを意図しています。 – David

+1

はい、私たちはES6でそれを持っています。そのような「辞書」を使用する必要があるのはなぜか分かりませんが、DOMからの任意のものへの参照の格納はメモリリークの直接的な方法であることに注意してください。 – estus

+0

辞書の理由は、入力フィールドにイベントを持たせることができるため、値が変更されたときに通知され、その新しい値を検索して変更することができます。これは、クリーンなコードとは別に、2つの場所を変更するだけでシステムにフックされたものを修正することもできます(1. HTMLボックスを追加します。2. JSがそれを見て値を取得/設定できる行を追加します)。 – David

関連する問題