2

我见过许多 javascript 对象都有一个“init”方法,您可以将值传递给该方法以设置对象。

当传入名称/值对数组时,它们如何在内部处理其私有变量的初始化,例如:

myObject.init( {prop1: "blah", prop2: "asdf", ..., propn: "n"} );

具体来说,其中一些值可以是可选的,因此如果在初始化期间传入了名称/值对,您将如何设置默认值然后覆盖它们。

4

6 回答 6

7
var myObject = {
  init: function(options) {
    this.foo = options.foo || 'some default';
    this.bar = options.requiredArg;

    if (!this.bar) raiseSomeError();
  }
}
于 2009-02-04T21:40:59.407 回答
5

这在 FF5、IE8、Chrome 12、Opera v11.5 上测试正常。默认值是什么并不重要,如果它们的键在调用列表中,它们将被覆盖,否则它们将被单独留下。

var myObject = {
   prop1: 'default1',
   prop2: 'default2',
   prop3: 'default3',
   prop4: 'default4',
   prop5: 'default5',
   prop6: 'default6',
   init: function(options) {
      for(key in options) {
         if(this.hasOwnProperty(key)) {
            this[key] = options[key]
         }
      }
   }
}

myObject.init( {prop1: "blah", prop2: "asdf", prop5: "n"} )
于 2011-07-04T14:26:32.937 回答
4

我能想到的最简洁的方法是使用包含所有默认属性的默认对象,如下所示:

function init( args ) {
    this.value = 'value' in args ? args.value : defaults.value;
}

您甚至可以使用 for 循环遍历默认对象,这样您就不必跟踪您希望对象包含哪些属性。

您应该使用“in”运算符,因为实际上可以将属性的值设置为未定义。将属性设置为未定义是有效的,在这种情况下,它实际上被视为已设置,确保未设置值的唯一方法是检查它是否根本不在对象中。

于 2009-02-04T21:53:29.803 回答
2

更好的是,从对象中获取 init 方法,以便您可以将 init 用于其他对象。

这在 FF5、IE8、Chrome 12、Opera v11.5 上测试正常。默认值是什么并不重要,如果它们的键在调用列表中,它们将被覆盖,否则它们将被单独留下。

var myGlobal = {
   init: function(obj, options) {
      for(key in options) {
         if(obj.hasOwnProperty(key)) {
            obj[key] = options[key]
         }
      }
   }
}

var myObject = {
   prop1: 'default1',
   prop2: 'default2',
   prop3: 'default3',
   prop4: 'default4',
   prop5: 'default5',
   prop6: 'default6'
}

myGlobal.init( myObject, {prop1: "blah", prop2: "asdf", prop5: "n"} )
于 2011-07-04T14:44:22.380 回答
1

哦让我们看看

编辑:更新,这确实有效

 
function myObject(){}

myObject.prototype.init = function (argObj)
{
    if (!argObj)
    {
        argObj = new Object();
    }

    var abc = (argObj['abc'] != undefined) ? argObj['abc'] : "default value 1";
    var defg = (argObj['defg'] != undefined) ? argObj['defg'] : "default value 2";
}
于 2009-02-04T21:39:01.487 回答
0

您可以使用三元运算符来检查是否设置了初始化数组的元素,如果设置则使用它,否则使用默认值。例如,假设初始化数据作为一个名为init...的对象传递。

var myObject = {
  init: function(opts) {
     this.foo=(typeof(opts.foo)!="undefined")?opts.foo:'default value';
  }
}

或者,您可以只复制初始化数组,覆盖先前设置的值

var myObject = {
  init: function(opts) {
      this.foo='default value';

      for (name in opts)
      {
         this[name]=opts[name];
      }
  }

请注意,像这样的成语

this.foo = opts.foo || 'some default';

如果 opts.foo 设置为评估为 false 的值,例如 0,则失败

于 2009-02-04T21:36:39.230 回答