Javascript 如何在类初始化时从构造函数数据创建对象

Javascript 如何在类初始化时从构造函数数据创建对象,javascript,class,ecmascript-6,Javascript,Class,Ecmascript 6,我希望在实例化类TableCategory的实例时,使用实例化时传入的数据创建一个对象。我希望这在实例化时自动发生。我不想实例化这个类,然后调用一个创建对象的方法。这似乎是不必要的麻烦 我之所以使用一个类,是因为我想使用getter和setter对多个实例化操作结果对象。(如果你想知道我为什么不首先使用对象。) 我对JS中的类不是100%清楚,所以我不确定哪里出了问题。请注意,对象创建是一个函数的产物,它接受实例化时传入的数组和类本机的数组 这是我的班级: export class TableC

我希望在实例化类
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
?不确定,感谢您的帮助。

forEach()
不会返回任何内容。创建一个空的
categoryData
对象,然后将其填入
forEach
循环中

此外,您需要使用箭头函数才能在回调函数中访问

类表类别{
构造函数(类别值=[]){
this.categoryValues=categoryValues;
this.categoryKeys=['alpha'、'beta'、'gamma'、'delta'];
this.categoryData={};
this.categoryKeys.forEach((键,i)=>
this.categoryData[key]=this.categoryValue[i]
)
}
}
const foo=新的表格类别(['a','b','c','d']);
console.log(foo.categoryData.beta);//b
forEach()
不返回任何内容。创建一个空的
categoryData
对象,然后将其填入
forEach
循环中

此外,您需要使用箭头函数才能在回调函数中访问

类表类别{
构造函数(类别值=[]){
this.categoryValues=categoryValues;
this.categoryKeys=['alpha'、'beta'、'gamma'、'delta'];
this.categoryData={};
this.categoryKeys.forEach((键,i)=>
this.categoryData[key]=this.categoryValue[i]
)
}
}
const foo=新的表格类别(['a','b','c','d']);

console.log(foo.categoryData.beta);//b
forEach
只返回
未定义的
。您仍然可以使用
object.fromEntries
以功能方式获取所需的对象

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

例如,您可以这样做:

类表类别{
构造函数(值=[]){
这个._obj=Object.fromEntries(['alpha','beta','gamma','delta']
.map((键,i)=>[键,值[i]]);
}
获取值(){
返回Object.values(this.\u obj);
}
获取密钥(){
返回Object.keys(this.\u obj);
}
}
设obj=newtablecategory([“this”、“is”、“a”、“test]”);

控制台日志(对象值)
forEach
只返回
未定义的
。您仍然可以使用
object.fromEntries
以功能方式获取所需的对象

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

例如,您可以这样做:

类表类别{
构造函数(值=[]){
这个._obj=Object.fromEntries(['alpha','beta','gamma','delta']
.map((键,i)=>[键,值[i]]);
}
获取值(){
返回Object.values(this.\u obj);
}
获取密钥(){
返回Object.keys(this.\u obj);
}
}
设obj=newtablecategory([“this”、“is”、“a”、“test]”);

控制台日志(对象值)为什么要存储冗余数据?如果您有
categoryData
(修复代码后),那么为什么还需要其他两个属性?使用第三个属性中的
Object.keys
Object.values
可以很容易地获取它们。当您开始变异实例时,您将有不必要的开销来保持这些属性的同步。@trincot我看不出有什么是多余的。你能澄清一下吗?哦,因为对象的值在每次实例化时都是不同的,但是键总是相同的。否则,我必须在每次实例化时传入两个数组,其中一个总是相同的。但也许我误解了你的意思?好吧,我已经发布了一个答案,显示了一个替代的实现
categoryData
将具有所有键/值对,但这些键也位于
categoryKeys
中,并且值也位于
categoryValues
中,因此所有内容都是双精度的。我认为您只需要
categoryData
,因为它暗示了其余部分。如果以后对某个值进行变异和更改,则不必同时在
categoryData
categoryValues
中对其进行更改(以避免不一致)。为什么要存储冗余数据?如果您有
categoryData
(修复代码后),那么为什么还需要其他两个属性?使用第三个属性中的
Object.keys
Object.values
可以很容易地获取它们。当您开始变异实例时,您将有不必要的开销来保持这些属性的同步。@trincot我看不出有什么是多余的。你能澄清一下吗?哦,因为对象的值在每次实例化时都是不同的,但是键总是相同的。否则,我必须在每次实例化时传入两个数组,其中一个总是相同的。但也许我误解了你的意思?好吧,我有