如何在撰写对象时避免名称冲突
How to avoid name clashes when composing objects
在JavaScript中,你可以使用某种extend
函数来组合对象。
例如,我可能有一个observable
类,它公开了一组公共方法(get
,push
,set
,increment
,get
等(。
在这种情况下,可观察量也恰好是一个事件发射器,所以它也公开了一组公共方法(emit
、on
、removeListener
等(。
这两个类都具有存储状态的内部下划线前缀属性。事件发射器使用 _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
内部属性,并且现在存在名称冲突。
我认为只是"必须知道"哪些对象依赖于混合蛋白安全工作的内部属性是丑陋的。
如何避免混合使用相同内部属性名称的两个对象?
理想情况下,这将使用 ES6 私有名称来解决,但我们还不能这样做,我们无法在不损失性能的情况下模拟它们。除非你能提供一个没有很大性能损失的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对象原型与jquery冲突
- 对象数组上的html5 javascript冲突
- 当一个对象与javascript画布中的另一个对象发生冲突时,如何停止该对象
- underscore.js,名为“”的全局对象;出口;和livefyre javascript API-集成冲突
- jquery UI 两个可拖动对象冲突
- 使用冲突的事件侦听器将对象分隔到原型链中
- Jquery $.ajax 获取响应与将“this”对象嵌套传递到“success”回调函数冲突
- 如何在撰写对象时避免名称冲突
- 未捕获的类型错误:对象 [对象对象] 没有方法“自动完成”(可能不是冲突问题)
- 对象在没有冲突后没有方法错误
- 未捕获的错误:不变冲突:元素类型无效:需要字符串(对于内置组件)或类/函数,但得到:对象
- 合并两个对象,如果冲突,则覆盖值
- 在html/css/javascript中移动对象检测与其他对象的冲突
- 如何处理与jQuery不冲突的对象类
- 不变量冲突:对象作为React的子对象是无效的
- 脚本加载冲突?对象在包含Adobe Edge动画时没有方法错误
- 实例冲突- JSON对象
- React不变量冲突:对象作为React的子对象是无效的
- Coffeescript对象、jquery回调和变量作用域的冲突和混淆
- 未捕获的不变冲突:对象作为React子对象无效