在JavaScript中,您可以使用某种extend
函数组合对象。
例如,我可能有一个observable
类,它公开了一组公共方法(get
,push
,set
,increment
,{{1等等)
在这种情况下,observable也恰好是一个EventEmitter,因此它还公开了另一组公共方法(get
,emit
,on
等等)
这两个类都有内部下划线前缀属性,用于存储状态。 eventemitter使用removeListener
来存储事件处理程序,而observable使用_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
内部属性,现在存在名称冲突。
我认为仅仅“必须知道”哪些对象依赖于mixin的内部属性才能安全地工作,我觉得很难看。
如何避免混合使用相同内部属性名称的两个对象?
理想情况下,这将通过ES6私有名称解决,但我们还不能这样做,我们无法模仿它们而不会失去性能。除非您能提供没有大的性能损失的ES6名称模拟,否则我对这些解决方案不感兴趣。
另一种方法是使用闭包或_state
,但随后您将为每个实例重新创建函数,这会显着降低性能。另一种方法是将内部属性命名为bind
和__eventEmitter_events
。这只是丑陋而且降低了命名空间冲突的可能性,它不会删除它。
答案 0 :(得分:0)
简单的解决方案是“名称空间”
var state = "Model@v0.1.3~state";
var Model = extend({}, Observable, {
constructor: function () {
// Nice, I used a namespace and don't clash with "Observable@v0.2.3~state"
this[state] = { ... }
},
someMethod: function () { ... }
})