首页 > 解决方案 > 如何在类初始化时从构造函数数据创建对象

问题描述

我希望当我实例化类的实例时,TableCategory使用实例化时传入的数据创建一个对象。我希望这在实例化时自动发生。我不想实例化类,然后调用创建对象的方法。这似乎不必要的麻烦。

我正在使用一个类,因为然后我想使用 getter 和 setter 来操作结果对象以进行多个实例化。(如果你想知道为什么我不只是首先使用一个对象。)

我对 JS 中的类不是 100% 清楚,所以我不确定我哪里出错了。请注意,对象的创建是一个函数的产物,它需要一个在实例化时传入的数组和一个类本机的数组。

这是我的课:

export class TableCategory {
  constructor(categoryValues = []) {
    this.categoryValues = categoryValues;
    this.categoryKeys = ['alpha','beta','gamma', 'delta'];
    this.categoryData = this.categoryKeys.forEach(function(key, i) { 
      return this.categoryData[key] = this.categoryValues[i]; 
     });
   }
}


然后,例如:

const foo = new TableCategory(['a'. 'b', 'c', 'd']);
console.log(foo.categoryData.beta); // b

也许我需要使用static?不确定,感谢任何帮助

标签: javascriptclassecmascript-6

解决方案


forEach不返回除undefined. 您仍然可以通过功能性方式获得所需的对象,但使用Object.fromEntries.

另外,正如您所说,您使用一个类是因为您打算使用 getter 和 setter 来改变实例,我认为将值和键与第三个属性分开存储并不是一个好主意,第三个属性包含所有键/值信息。

例如,您可以这样做:

class TableCategory {
  constructor(values = []) {
    this._obj = Object.fromEntries(['alpha','beta','gamma', 'delta']
                      .map((key, i) => [key, values[i]]));
  }
  get values() {
      return Object.values(this._obj);
  }
  get keys() {
      return Object.keys(this._obj);
  }
}

let obj = new TableCategory(["this", "is", "a", "test"]);

console.log(obj.values);


推荐阅读