在 JavaScript 中,您可以使用某种extend
函数来组合对象。
例如,我可能有一个公开observable
一组公共方法(、、、、、、等)的类get
push
set
increment
get
在这种情况下,observable 也恰好是一个 EventEmitter,因此它还公开了一组进一步的公共方法(emit
、on
、removeListener
等)
这两个类都具有存储状态的内部下划线前缀属性。eventemitter 用于_events
存储事件处理程序,observable 用于存储 state_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
内部属性并且现在存在名称冲突。
我认为仅仅“必须知道”哪些对象依赖于 mixin 的哪些内部属性才能安全工作,这很丑陋。
如何避免混合使用相同内部属性名称的两个对象?
理想情况下,这将通过 ES6 私有名称来解决,但我们还不能这样做,而且我们不能在不损失性能的情况下模拟它们。除非您可以提供不会造成很大性能损失的 ES6 名称仿真,否则我对这些解决方案不感兴趣。
另一种方法是使用闭包,或者bind
您将为每个实例重新创建函数,这会导致显着的性能损失。另一种选择是将命名空间内部属性作为__eventEmitter_events
和__observable_state
。这很丑陋,并且减少了命名空间冲突的可能性,它不会删除它。