首先,我会允许对象构造函数接受一个参数
function User(params) {
...
为了允许提供任意数量的参数,params
参数将接受一个对象字面量:
new User({name: 'name 1', id: 1});
接下来,我将params
对象传递给一个通用函数,该函数将处理从params
对象到target
对象的属性分配。
function setObjectProperties(params, target) {
}
该setObjectProperties
函数需要验证我们是否正确传递了一些数据。它检查是否都定义了params
和target
:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
}
}
一旦我们确信我们可以使用某些东西,就该迭代参数并分配给对象属性了。
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, function (i, property) {
this[i] = property;
}, target);
}
}
使用 jQuery 的$.each
函数,它迭代对象的属性而没有迭代所有对象属性(如原型等)的副作用。这可行,但意味着我们需要处理this
在函数的回调闭包中重新定义的副作用$.each
。我们现在不再知道什么是原始对象了。
但是,jQuery 的$.proxy
函数旨在允许我们调用函数,同时指定我们想要使用的内容this
:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
this[key] = value;
}, target));
}
}
这里我们告诉 jQuery 设置this
为目标参数的值,该参数是this
在对象构造函数内部设置的,如下所示:
function User(params) {
this.name = null;
this.email = null;
this.password = null;
setObjectProperties(params, this);
}
一个问题仍然存在,我们应该检查对象上声明的属性,看看我们是否可以分配传入的值:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
if (this.hasOwnProperty(key)) {
this[key] = value;
}
}, target));
}
}
这是完整和最终的代码:
function setObjectProperties(params, target) {
if (params !== undefined && target !== undefined) {
$.each(params, $.proxy(function (key, value) {
if (this.hasOwnProperty(key)) {
this[key] = value;
}
}, target));
}
}
function User(params) {
this.name = null;
this.email = null;
this.password = null;
setObjectProperties(params, this);
}
user1 = new User();
// User { name: null, email: null, password: null }
user2 = new User({ name: 'First Last' });
// User { name: "First Last", email: null, password: null }
user3 = new User({ name: 'First Last', age: '400' });
// User { name: "First Last", email: null, password: null }