【问题标题】:Incrementing object id递增对象 ID
【发布时间】:2017-08-01 09:51:34
【问题描述】:
var nextid = 0
function Animal(name) {
    this.name = name
    Object.defineProperty(this, 'nextid',
    {value: nextid++, writable: false})
}
var animal1 = new Animal('dog')
var animal2 = new Animal('cat')

我想知道与使用闭包或工厂模式相比,这是否是一种好方法?

我的问题类似于这个线程(建议关闭和工厂模式):

Incrementing object id automatically JS constructor (static method and variable)

【问题讨论】:

    标签: javascript oop object closures prototype-programming


    【解决方案1】:

    Ids 不应作为构造对象的一部分生成:它们应分配给对象。

    想想一场运动比赛:跑步者会选择他们的背部吗?

    function Animal() {
    
    }
    
    var idGenerator = new IdGenerator();
    var animal = new Animal();
    animal.id = idGenerator.generate();
    

    也许您仍然可以在构造函数中生成 ids,但我会尽量避免硬编码 id generation 而是注入idGenerator

    function Animal(idGenerator) {
        this.id = idGenerator.generate();
    }
    

    顺便说一句,我的两分钱是你应该采用第一种方法:跑步者不会自己分配背部。

    【讨论】:

      【解决方案2】:

      链接答案中的那些闭包和工厂模式仅用于将 nextid 变量封装在本地范围或工厂实例中。如何创建动物——作为普通对象、类实例或具有只读属性的实例——与此无关。他们每个人都一样好。

      您是否真的需要封装取决于您的模块化方法(例如,闭包在节点模块中毫无意义)和 id 的唯一性要求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2013-11-16
        • 2014-09-10
        • 1970-01-01
        • 2013-12-22
        相关资源
        最近更新 更多