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的灵活性令人惊讶。至于代码建议——我收到的代码最初有一些类似的东西,所以你建议的修改让我的生活更轻松。