javascript - 组合对象时如何避免名称冲突

标签 javascript naming-conventions composition object-design

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

例如,我可能有一个 observable公开一组公共(public)方法的类(getpushsetincrementget等)

在这种情况下,可观察对象也恰好是一个 EventEmitter,因此它还公开了一组进一步的公共(public)方法(emitonremoveListener 等)

这两个类都有存储状态的内部下划线前缀属性。 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/

相关文章:

javascript - amcharts numberFormatter 不适用于串行图表

c# - 什么时候应该在 C# 方法名称中使用 "Try"?

naming-conventions - 匈牙利符号的好例子?

python - 如何重定向 Python 中包含的类的所有方法?

f# - 我缺少什么: is function composition with multiple arguments possible?

javascript - 问题是在 django 中使用 ajax 保存多条记录

Javascript:如何在 jQuery 中编写这个放置事件?

javascript - JavaScript中如何判断页面是否跳转到了 anchor (#)?

swift - 私有(private)属性的命名约定

javascript - 如何阅读 es6/javascript 中的函数组合?