создание объекта в JavaScript, который имеет метод 'init' с необязательными парами имя / значение - PullRequest
2 голосов
/ 05 февраля 2009

Я видел много объектов javascript, у которых есть метод 'init', которому вы передаете значения для установки объекта.

Как они внутренне обрабатывают инициализации своих приватных переменных при передаче в массиве пар имя / значение, таких как:

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

В частности, некоторые из этих значений могут быть необязательными, поэтому как бы вы установили значения по умолчанию, а затем переопределили их, если пара имя / значение была передана во время инициализации.

Ответы [ 6 ]

7 голосов
/ 05 февраля 2009
var myObject = {
  init: function(options) {
    this.foo = options.foo || 'some default';
    this.bar = options.requiredArg;

    if (!this.bar) raiseSomeError();
  }
}
4 голосов
/ 04 июля 2011

Это нормально работает на 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"} )
4 голосов
/ 05 февраля 2009

Самым чистым способом, который я могу придумать, было бы использование объекта по умолчанию, который содержит все свойства по умолчанию следующим образом:

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

Вы можете даже перебрать объект по умолчанию, используя цикл for, чтобы вам не приходилось отслеживать, какие свойства вы хотите, чтобы объект содержал.

Вы должны использовать оператор "in", так как на самом деле можно установить значение свойства неопределенным. Допустимо установить для свойства значение undefined, и в этом случае оно фактически считается установленным. Единственный способ убедиться, что значение не было установлено, - это проверить, что его вообще нет в объекте.

2 голосов
/ 04 июля 2011

Еще лучше: возьмите метод 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"} )
1 голос
/ 05 февраля 2009

о, давайте посмотрим

edit: обновлено, это на самом деле работает

 
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";
}
0 голосов
/ 05 февраля 2009

Вы можете использовать троичный оператор, чтобы проверить, установлен ли элемент массива инициализации, и использовать его, если он есть, или использовать значение по умолчанию, если нет. Например, предполагая, что данные инициализации передаются как объект с именем 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 задано значение, которое оценивается как ложное, например, 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...