JavaScript:将参数对象的值指定为Object中的字段

时间:2014-06-26 00:36:04

标签: javascript oop

我目前正在从

的形式转换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”范例。请。吉斯。救命。

1 个答案:

答案 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];