javascript - ES6 将对象传递给构造函数并设置属性

标签 javascript class ecmascript-6 es6-class

看下面的例子:

class Parent {
    constructor({ parentOnlyArg = 'default value' } = {}) {
        this.parentOnlyArg = parentOnlyArg;
    }
}

class Child extends Parent {
    // this class and also any class inheriting from it
    constructor({ visibleStyle = 'inline' } = {}) {

        // I want to pass argument to super as an object
        super(/** args **/);

        this.visibleStyle = visibleStyle;
    }
}

class Child2 extends Parent {
    // Specifying parentOnlyArg as default will change the behaviour
    constructor({ parentOnlyArg = 'another parent value',
                  someOther = 'value' } = {}) {

        // I want to pass argument to super as an object
        super(/** args **/);

        this.someOther = someOther;
    }
}

是否可以将构造函数参数传递给 super?

看起来比我想象的要简单

super(...arguments);

然后我可以使用创建Child

var c1 = new Child(); // c.parentOnlyArg = 'default value'
var c2 = new Child2(); // c.parentOnlyArg = 'another parent value'
var c3 = new Child({ parentOnlyArg: 'changed again' }); // c.parentOnlyArg = 'changed again'

最佳答案

您可以使用object destructuring with rest properties 。浏览器尚未实现,但 BabelJs可以转译它。

function assertEmpty(obj) {
  if (Object.keys(obj).length > 0) {
    throw new Error("Unexpected parameters");
  }
}
    
class A {
  constructor({ a = "foo", ...rest } = {}) {
    assertEmpty(rest);
    console.log("new A " + a);
  }
}
    
class B extends A {
  constructor({ b = "bar", ...rest } = {}) {
    super(rest);
    console.log("new B " + b);
  }
}
    
new B({a:2}); // prints 'new A 2', 'new B bar'
new B({a:4, b:5, c:6}); // throws 'Unexpected parameters'

在上面的代码片段中,父类看不到后代消耗的参数。如果您遇到问题,可以按照@Bergi 或@loganfsmyth 的建议进行操作。例如:

class A {
  constructor(params = {}) {
    const { a = "foo" } = params;
    console.log("a=" + a);
  }
}

class B extends A {
  constructor(params = {}) {
    const { b = "bar" } = params;
    super(params);
    console.log("b=" + b);
  }
}

new B({a:2}); // prints a=2 b=bar
new B({b:5}); // prints a=foo b=5

关于javascript - ES6 将对象传递给构造函数并设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44887848/

相关文章:

c++ - 将 char 数组传递给参数化构造函数

javascript - ReactJS:为什么将值推送到对象中的状态会删除数据?

javascript - 如何避免在javascript中等待 hell

Javascript:创建不继承 css 的元素?

javascript - ng-change 不适用于我的半自定义日历控件

javascript - 为什么不像输入元素那样在克隆时选择和文本区域值更改得到更新?

python - Python函数中的持久变量

c# - 在另一个类中使用一个类?

Javascript 将字符串常量定义为速记属性

javascript - 使用javascript过滤剪切/复制选择?