es5里面构造函数这么传参太麻烦了,如果用es6写有没有更优雅的方式呢?或者es5环境下有更好的方式也行呀?
构造函数里面除了提供参数列表(或者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]
如果你的参数超过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();
其实函数参数太多,也很麻烦,想不到有啥优雅方式。
但是如果把参数整合成一个对象,你看这样算优雅不?
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"]
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
函数入口参数不宜过多,一般都是用一个options之类的对象,调用的时候传入一个对象,这样拓展也更加灵活。