JavaScript 中子类的实例计数应该用什么方法?
What method should I use to count instances of subclasses in JavaScript?
我想实现一个计数器,为 类(和子类)的每个实例生成唯一 ID。
目前我用的是:
class Item {
constructor(type) {
this.constructor.counter = (this.constructor.counter || 0) + 1;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
你看到问题了吗?如果我首先通过实例化一个 SubItem 来做到这一点,那么每个都可以正常工作......但是当我首先实例化 "mother class" 时,计数器就坏了。有办法解决这个问题吗?
我正在寻找的行为是:
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_1"
var test6 = new SubItem(); // <- "sub_item_2"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
将唯一 ID 放在构造函数之外,并允许所有 类 将其递增。
let INSTANCE_COUNT = 0;
class Item {
constructor(type) {
this.type = type || "item";
this._id = `${this.type}_${INSTANCE_COUNT++}`;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_0"
var test2 = new Item(); // <- "item_1"
var test3 = new Item(); // <- "item_2"
var test4 = new Item(); // <- "item_3"
var test5 = new SubItem(); // <- "sub_item_4"
var test6 = new SubItem(); // <- "sub_item_5"
var test7 = new Item(); // <- "item_6"
var test8 = new Item(); // <- "item_7"
问题是 SubItem
上的 counter
属性 遮蔽 counter
属性在 Item
class 上。因此,当以下行运行时:
this.constructor.counter = (this.constructor.counter || 0) + 1;
当第一个 SubItem
被实例化时,正在 访问的 this.constructor.counter
是 Item
上的 counter
,通过原型继承。但随后对 this.constructor.counter
的赋值直接在 SubItem 上赋值给 counter
属性 。 (因此,SubItem
的进一步实例化将直接在 SubItem
上引用 counter
而不是父 class)。
您可能会检查 counter
属性 是否 直接在构造函数 上,而是通过 hasOwnProperty
:
class Item {
constructor(type) {
this.constructor.counter = ((this.constructor.hasOwnProperty('counter') && this.constructor.counter) || 0) + 1;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
我想我会简单地初始化父类和子类的计数器。我有点犹豫,但我认为它更清晰并简化了构造函数中的代码。这也让子类控制起点(不是我认为那超级有用):
class Item {
constructor(type) {
this.constructor.counter++;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
Item.counter = 0 // initialize
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
SubItem.counter = 0 // initialize
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
我想实现一个计数器,为 类(和子类)的每个实例生成唯一 ID。
目前我用的是:
class Item {
constructor(type) {
this.constructor.counter = (this.constructor.counter || 0) + 1;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
你看到问题了吗?如果我首先通过实例化一个 SubItem 来做到这一点,那么每个都可以正常工作......但是当我首先实例化 "mother class" 时,计数器就坏了。有办法解决这个问题吗?
我正在寻找的行为是:
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_1"
var test6 = new SubItem(); // <- "sub_item_2"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
将唯一 ID 放在构造函数之外,并允许所有 类 将其递增。
let INSTANCE_COUNT = 0;
class Item {
constructor(type) {
this.type = type || "item";
this._id = `${this.type}_${INSTANCE_COUNT++}`;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_0"
var test2 = new Item(); // <- "item_1"
var test3 = new Item(); // <- "item_2"
var test4 = new Item(); // <- "item_3"
var test5 = new SubItem(); // <- "sub_item_4"
var test6 = new SubItem(); // <- "sub_item_5"
var test7 = new Item(); // <- "item_6"
var test8 = new Item(); // <- "item_7"
问题是 SubItem
上的 counter
属性 遮蔽 counter
属性在 Item
class 上。因此,当以下行运行时:
this.constructor.counter = (this.constructor.counter || 0) + 1;
当第一个 SubItem
被实例化时,正在 访问的 this.constructor.counter
是 Item
上的 counter
,通过原型继承。但随后对 this.constructor.counter
的赋值直接在 SubItem 上赋值给 counter
属性 。 (因此,SubItem
的进一步实例化将直接在 SubItem
上引用 counter
而不是父 class)。
您可能会检查 counter
属性 是否 直接在构造函数 上,而是通过 hasOwnProperty
:
class Item {
constructor(type) {
this.constructor.counter = ((this.constructor.hasOwnProperty('counter') && this.constructor.counter) || 0) + 1;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"
我想我会简单地初始化父类和子类的计数器。我有点犹豫,但我认为它更清晰并简化了构造函数中的代码。这也让子类控制起点(不是我认为那超级有用):
class Item {
constructor(type) {
this.constructor.counter++;
this.type = type || "item";
this._id = this.type + "_" + this.constructor.counter;
console.log(this.id);
}
get id() {
return this._id;
}
}
Item.counter = 0 // initialize
class SubItem extends Item {
constructor() {
super("sub_item");
}
}
SubItem.counter = 0 // initialize
var test1 = new Item(); // <- "item_1"
var test2 = new Item(); // <- "item_2"
var test3 = new Item(); // <- "item_3"
var test4 = new Item(); // <- "item_4"
var test5 = new SubItem(); // <- "sub_item_5"
var test6 = new SubItem(); // <- "sub_item_6"
var test7 = new Item(); // <- "item_5"
var test8 = new Item(); // <- "item_6"