我们可以在每个类中创建一个静态方法,该方法接受arguments 对象和一个名称数组,并返回一个可以使用Object.assign 分配给新实例的对象。
使用Babel REPL查看。
class Something {
static buildArgs (ctx, args, paramNames) {
let obj = {}
Array.from(args).forEach(function (arg, i) {
let name = paramNames[i] || i
obj[name] = args[i]
})
Object.assign(ctx, obj)
}
constructor () {
Something.buildArgs(this, arguments, [
'param1',
'param2'
]);
console.log(this)
}
}
new Something('one', 'two')
诚然,添加一个方法buildArgs 意味着这个解决方案并不短,但是constructor 的主体是,我们也有这些优点:
- 您只需要编写一次参数名称。
- 您受到保护,不会被缩小。
上面的代码包含额外的参数 (i >= paramNames.length),但是如果这种行为不受欢迎,我们可以修改它,以便这些仍然被解析,但没有分配给实例:
class Something {
static buildArgs (ctx, args, paramNames) {
let obj = {instance: {}, extra: {}}
Array.from(args).forEach(function (arg, i) {
let name = paramNames[i] || i
if (name) {
obj.instance[name] = args[i]
} else {
obj.extra[i] = args[i]
}
})
Object.assign(ctx, obj)
}
constructor () {
let args = Something.buildArgs(this, arguments, ['param1', 'param2']);
// Do stuff with `args.extra`
}
}
或完全忽略:
static buildArgs (args, paramNames) {
let obj = {}
Array.from(args).forEach(function (arg, i) {
let name = paramNames[i]
if (name) obj[name] = args[i]
})
return obj
}