es6语法怎么优雅的传参?

clipboard.png
es5里面构造函数这么传参太麻烦了,如果用es6写有没有更优雅的方式呢?或者es5环境下有更好的方式也行呀?

阅读 13k
13 个回答

函数入口参数不宜过多,一般都是用一个options之类的对象,调用的时候传入一个对象,这样拓展也更加灵活。

构造函数里面除了提供参数列表(或者options)以外,一般还提供默认值:

如果全部平铺的话,基本会像这样:

function MyClass (a, b, c) {
  this.a = a || 'a'
  this.b = b || 'b'
  this.c = hasValue(c) ? c : false
}

es5的时候,基本上是@Dont这种方式:

function MyClass (options) {
  var defaultOptions = {
    a: 'a',
    b: 'b',
    c: false
  }
  this.options = {} // 个人习惯将传入的options放在options内,而不直接放在this上
  for (var p in defaultOptions) {
    if (hasValue(options[p]) {
       this.options[p] = options[p]
    } else {
       this.options[p] = defaultOptions[p]
    }
  }
}

使用es6的话,默认值可以更方便点,如果放在this上可以这样做:

function MyClass({ a = false, b = 0, c, d }) {
  Object.assign(this, arguments[0])
}

大致是这样

[this.tx,this.ty,this.x,this.y,this.dead,this.centerX,this.centerY,this.radius,this.color] = [...arguments]

es6的rest参数(也就是...arguments)有些情况下传参会省点事
rest

如果你的参数超过2个(3个的情况酌情考虑)就最好是采用 options 对象了。
另外,你可以考虑使用 Builder(创建者) 模式

// 简单的创建者实现
class FragBuilder {
    static create() {
        return new FragBuilder();
    }

    constructor() {
        this.frag = new Frag();
        this.frag.dead = false;
    }

    setCenter(x, y) {
        this.frag.x = this.frag.centerX = x;
        this.frag.y = this.frag.centerY = y;
        return this;
    }

    setRadius(radius) {
        this.frag.radius = radius;
        return this;
    }

    setColor(color) {
        this.frag.color = color;
        return this;
    }

    setTPoint(x, y) {
        this.frag.tx = x;
        this.frag.ty = y;
    }

    build() {
        let frag = this.frag;
        this.frag = null;
        return frag;
    }
}

使用示例

var frag = FragBuilder.create()
    .setCenter(1, 1)
    .setTPoint(2, 2)
    .setColor("red")
    .setRadius(1)
    .build();

es6只是简化了函数书写方式,传参并没有改变的

var Frag = (x,y,z)=>{}

其实函数参数太多,也很麻烦,想不到有啥优雅方式。

但是如果把参数整合成一个对象,你看这样算优雅不?
PS: 没对参数类型做判断

var Frag = function(){
    var arg = arguments[0];
    for(var key in arg){
        this[key] = arg[key];
    }
};
var f = new Frag({cx:1,cy:2,r:3,c:4,tx:5,ty:6});
console.log(f.cy);

封装成一个对象传过去...

function myFunction(...options) {

 return options;

}
myFunction('a', 'b', 'c'); // ["a", "b", "c"]

我印象中一般传参就这么两种方式吧

  • func(a,b,c)

  • func({a, b, c})

我一般四个参数以下第一种,四个参数以上第二种

人家都说es6,上面一大堆用对象,还那么多人点赞?
参考 @我也试着去用心 @6666 写的。

新手上路,请多包涵

参数过多就丢在对象里传过去

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题