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)
答案 0 :(得分:1)
链接答案中的闭包和工厂模式仅用于将nextid
变量封装在本地范围或工厂实例中。如何创建动物 - 作为普通对象,作为类实例,或具有只读属性的实例 - 与此无关。他们每个人都同样好。
您是否真的需要封装取决于您的模块化方法(例如,闭包在节点模块中毫无意义)以及对ID的唯一性要求。
答案 1 :(得分: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();
}
顺便说一下,我的两分钱是你应该采用的第一种方法:跑步者不会自己分配背部。