在 JavaScript 中,您可以使用某种extend
函数组合对象。
例如,我可能有一个 observable
公开一组公共(public)方法的类(get
、push
、set
、increment
、get
等)
在这种情况下,可观察对象也恰好是一个 EventEmitter,因此它还公开了一组进一步的公共(public)方法(emit
、on
、removeListener
等)
这两个类都有存储状态的内部下划线前缀属性。 eventemitter 使用 _events
来存储事件处理程序,而 observable 使用 _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 私有(private)名称来解决,但我们还不能这样做,我们不能在不损失性能的情况下模拟它们。除非你能提供一个 不会有很大性能损失 的 ES6 名称模拟,否则我对这些解决方案不感兴趣。
另一种方法是使用闭包或 bind
,但这样您就需要为每个实例重新创建函数,这会显着降低性能。另一种方法是将内部属性命名为 __eventEmitter_events
和 __observable_state
。这很丑陋,并且降低了命名空间冲突的可能性,但它并没有消除它。
最佳答案
简单的解决方案是“命名空间”
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 () { ... }
})
关于javascript - 组合对象时如何避免名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397298/