JavaScript:将对象参数的值指定为对象中的字段
我目前正在将对象构造函数从JavaScript:将对象参数的值指定为对象中的字段,javascript,oop,Javascript,Oop,我目前正在将对象构造函数从 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 = { 'fiel
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 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”范式。请伪装。救命啊 我认为您需要括号符号,而不是圆点符号:
for (var name in options) {
this[name] = options[name];
}
请注意,for…在
循环中迭代继承的属性,您可能需要检查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];
}
}
请尝试
this[name]=options[name]
。对于Javascript对象,您可以像对待对象属性一样对待索引。这是行不通的,因为args
是一个带有整数键的数组,defaultArgs
是一个带有非数字键的对象。你不会在两者中找到任何i
。if(typeof(args[i]='undefined'))
将始终返回true
,因为(args[i]='undefined')
将返回一个布尔值,typeof
将转换为字符串“boolean”,并且任何字符串的计算结果都为true。您可能需要if(typeof args[i]=“undefined”)
@KodleeYin,这是因为索引是对象属性。:-)谢谢大家!反馈都很好。我会试试你的建议。defaultArgs
是用对象文字初始化的,没有自定义原型。我们可以安全地假设没有继承的可枚举属性,不需要进行hasOwnProperty()
测试。@Bergi可能是另一个修改了Object.prototype
的脚本。但是,是的,这可能是不必要的,这只是一个警告。然后这将是该脚本的错误。你不必在意。谢谢,第一部分的工作正是我所认为的。JavaScript的灵活性令人惊讶。至于代码建议——我收到的代码最初有一些类似的东西,所以你建议的修改让我的生活更轻松。