此技巧一般用于对象构造函数,但实际上适用于所有函数。
这里仅以构造函数为例,说明问题
问题背景
创建对象时,可以使用构造函数。
function Car(make, model, year, color, passengers, convertible, mileage) {
this.make = make;
this.model = model;
this.year = year;
this.color = color;
this.passengers = passengers;
this.convertible = convertible;
this.mileage = mileage;
this.started = false;
this.start = function() {
this.started = true;
};
this.stop = function() {
this.started = false;
};
}
var chevy = new Car("Chevy", "Bel Air", 1957, "red", 2, false, 1021);
但如果要创建的对象包含的属性过多,也会导致构造函数包含大量的形参。
缺点:
- 代码难以阅读和维护
- 若没有按正确的顺序传入实参,或遗漏了某个实参,将导致难以发现的bug
用一个容器(对象字面量)传递所有参数
其实就是用对象字面量创建一个对象,并将所需的所有参数保存在该对象中,然后把该对象作为参数传递给函数
这样的好处是:函数只有一个参数,阅读容易,且不必担心实参与形参的顺序问题
function Car(params) {
this.make = params.make;
this.model = params.model;
this.year = params.year;
this.color = params.color;
this.passengers = params.passengers;
this.convertible = params.convertible;
this.mileage = params.mileage;
this.started = false;
this.start = function() {//在方法中未用到传入的参数,因此无需修改
this.started = true;
};
this.stop = function() {
this.started = false;
};
}
使用一个对象字面量代替所有参数/
var chevyParams = {make: "Chevy",
model: "Bel Air",
year: 1957,
color: "red",
passengers: 2,
convertible: false,
mileage: 1021};
var chevy = new Car(chevyParams);