我目前正在从
的形式转换Object构造函数function Obj(arg1, arg2, arg3, arg4, ..., argN-1, argN) {
this.name = arg1;
this.field = arg2;
this.etc = arg3;
...
} //Obj
以
的形式function Obj() {
var args = Array.prototype.slice.call(arguments);
var defaultArgs = {
'field' : default
...
};
... check args, etc
} //Obj
到目前为止,这是我的代码:
function DSObj () {
var args = Array.prototype.slice.call(arguments);
var defaultArgs = {
'fields' : values or functions returning values
...
};
var options = {};
for (var i in defaultArgs) {
if (typeof(args[i] == 'undefined')) {
options[i] = defaultArgs[i];
} else {
options[i] = args[i];
} //check if the user supplied this argument
} //for each possible argument
for (var name in options) {
this.name = options[name]; //trying to make fields - obviously wrong
} //for each final parameter
} //constructor for DSObj
所以,我需要帮助的是上面构造函数的最后一部分。我刚刚在一周前开始编写JavaScript,我的教育就是阅读初学者语法书。所以,如果除了愚蠢和直接的方式之外还有更好的方法,请告诉我。我不能仅仅引用上面的选项数组的原因是,以某种方式为此对象编写的所有方法都使用“this.method”范例。请。吉斯。救命。
答案 0 :(得分:2)
我认为你需要括号表示而不是第一点:
for (var name in options) {
this[name] = options[name];
}
请注意for...in
循环迭代继承的属性,您可能需要检查options.hasOwnProperty(name)
以避免这种情况。
另请注意,当您迭代defaultArgs
时,i
是每个属性。但args
使用数字编制索引,而不是自定义键。
您可以使用类似
的内容function DSObj () {
var argNames = ['fields', /*...*/],
defaultArgs = [ /* ..., ... */];
for (var i=0, l=arguments.length; i<l; ++i) {
this[argNames[i]] = arguments[i] || defaultArgs[i];
}
}
如果arguments[i]
可能是假的,那么
this[argNames[i]] = arguments[i] !== void 0 ? arguments[i] : defaultArgs[i];