如何在编写对象时避免名称冲突

Ray*_*nos 5 javascript naming-conventions composition object-design

在JavaScript中,您可以使用某种extend函数组合对象.

例如,我可能有一个observable是公开一组公共方法类(get,push,set,increment,get,等)

在这种情况下可观察到的也恰好是一个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 () { ... }
})
Run Code Online (Sandbox Code Playgroud)

这会导致问题,因为Observable已经使用了_state内部属性,现在存在名称冲突.

我认为只是"必须知道"哪些对象依赖于mixin的内部属性才能安全地工作.

如何避免混合使用相同内部属性名称的两个对象?

理想情况下,这将通过ES6私有名称解决,但我们还不能这样做,我们无法模仿它们而不会失去性能.除非您能提供没有大的性能损失的ES6名称仿真,否则我对这些解决方案不感兴趣.

另一种方法是使用闭包,bind但是然后你将为每个实例重新创建函数,这是一个显着的性能损失.另一种方法是将内部属性命名为__eventEmitter_events__observable_state.这只是丑陋并降低了命名空间冲突的概率,它不会删除它.

Ray*_*nos 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 () { ... }
})
Run Code Online (Sandbox Code Playgroud)