如何在ES6中使用类扩展对象?

时间:2019-04-02 11:19:23

标签: javascript ecmascript-6

我正在尝试清理我的ES6类定义,我现在有这种代码:

class SomeClass {
  constructor({a, b, c, d, e}) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.e = e;
    // some codes here
  }
  // some methods here..
}

这段代码将传递给构造函数的所有内容扩展了。

我以这种方式使用它:

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5});

当我想更改传递给构造函数的参数时,例如:

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6});

我希望obj.f成为6

如果要向其传递不同的参数,我希望构造函数可重用。如果传递给构造函数的参数发生更改,则返回值也会更改。

我尝试过:

class SomeClass extends Object {
  constructor(params) {
    super(params);
    // some codes here
  }
  // some methods here..
}

但这不起作用。

那为什么不起作用?如果我扩展Object类,为什么super({a:1})不返回{a:1}

$ node
> new Object({a:1})
{ a: 1 }
> class MyClass extends Object {
... constructor(params) { super(params); }
... }
undefined
> new MyClass({a:1})
MyClass {}

以及如何实现我的目标?

4 个答案:

答案 0 :(得分:4)

我不太确定我是否了解您的需求,但是看起来像这样的简单事情应该可以满足您的需求:

class SomeClass {
  constructor(obj) {
    Object.assign(this, obj);
    // some codes here
  }
  // some methods here..
}

那样

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6});

工作正常。

答案 1 :(得分:2)

认为您可能想要类似的东西:

class SomeClass {
  constructor(o) {
    Object.assign(this, o);   
  }  
}

console.log(new SomeClass({a:1}))
console.log(new SomeClass({a:1, b:2, c:3, d:4, e:5}))

答案 2 :(得分:1)

正如其他人指出的那样,使用Object.assign可以解决您的情况,而不是从Object扩展。

class SomeClass {
  constructor(obj) {
    Object.assign(this, obj);   
  }  
}


console.log(new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6}))

关于答案,当您在由Object扩展的类中调用super(params)时,就是在调用Object的构造函数,该构造函数没有参数。

使用new Object({a:1})时,您是在调用方法而不是构造函数。

起初我也感到困惑,我必须对此进行研究。

参考和更多信息在这里:

https://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-object-constructor

答案 3 :(得分:0)

我们可以使用传播运算符获取其余参数。

示例:

class SomeClass {
  constructor({a, b, c, d, e, ...rest}) { 
    console.log(rest);
  }
}

在这里rest变量将拥有所有剩余的余数,可以是n。

并且您可以

var obj = new SomeClass({a:1, b:2, c:3, d:4, e:5, f:6, g: 7});

我希望这对您有帮助