递增对象 ID
Incrementing object id
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')
我想知道与使用闭包或工厂模式相比,这是否是一种好方法?
我的问题与这个帖子类似(建议使用闭包和工厂模式):
链接答案中的闭包和工厂模式仅用于将 nextid
变量封装在本地范围或工厂实例中。你如何创建动物——作为一个普通对象,作为一个 class 实例,或者一个具有只读 属性 的实例 - 与此无关。他们每个人都一样好。
您是否真的需要封装取决于您的模块化方法(例如,闭包在节点模块中毫无意义)和 id 的唯一性要求。
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();
}
顺便说一句,我的两点是你应该采用第一种方法:跑步者不会自己分配背部。
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')
我想知道与使用闭包或工厂模式相比,这是否是一种好方法?
我的问题与这个帖子类似(建议使用闭包和工厂模式):
链接答案中的闭包和工厂模式仅用于将 nextid
变量封装在本地范围或工厂实例中。你如何创建动物——作为一个普通对象,作为一个 class 实例,或者一个具有只读 属性 的实例 - 与此无关。他们每个人都一样好。
您是否真的需要封装取决于您的模块化方法(例如,闭包在节点模块中毫无意义)和 id 的唯一性要求。
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();
}
顺便说一句,我的两点是你应该采用第一种方法:跑步者不会自己分配背部。