JavaScriptでは、ある種のextend
関数を使用してオブジェクトを作成できます。
たとえば、一連のパブリックメソッド(、、、、、など)を公開するクラスがあるとobservable
します。get
push
set
increment
get
この場合、observableはEventEmitterでもあるため、パブリックメソッドのセット(、、、など)も公開されemit
ます。on
removeListener
これらのクラスは両方とも、状態を格納する内部アンダースコアプレフィックス付きプロパティを持っています。eventemitterは_events
、イベントハンドラーと監視可能な用途_state
を_id
保存し、状態とIDを保存するために使用します。
さて、このようなオブジェクトコンポジションを使用してモデルを作成すると
var Model = extend({}, Observable, {
constructor: function () {
// Oops, I was supposed to know Observable uses the _state name already
this._state = { ... }
},
someMethod: function () { ... }
})
Observable
すでに_state
内部プロパティを使用しており、名前の衝突が発生しているため、これにより問題が発生します。
ミックスインが安全に機能するために、どのオブジェクトがどの内部プロパティに依存しているかを「知る必要がある」だけでは醜いと思います。
同じ内部プロパティ名を使用する2つのオブジェクトが混在しないようにするにはどうすればよいですか?
理想的には、これはES6のプライベート名で解決されますが、まだそれを行うことはできず、パフォーマンスを損なうことなくそれらをエミュレートすることはできません。パフォーマンスに大きなペナルティがないES6名エミュレーションを提供できない限り、これらのソリューションには興味がありません。
別の方法はクロージャを使用することbind
ですが、そうすると、すべてのインスタンスの関数を再作成することになり、パフォーマンスが大幅に低下します。もう1つの方法は、内部プロパティを__eventEmitter_events
およびとして名前空間化すること__observable_state
です。それは単に醜く、名前空間の衝突の可能性を減らします、それはそれを削除しません。