我正在尝试清理我的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 {}
以及如何实现我的目标?
答案 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});
我希望这对您有帮助