vytvoření objektu v JavaScriptu, který má ‚init‘ metodu s volitelnými páry název / hodnota

hlasů
2

Viděl jsem mnoho objektů JavaScriptu, které mají ‚init‘ metodu, kterou zadáte do hodnot za účelem nastavení objektu.

Jak se vnitřně zpracovat inicializace svých soukromých proměnných, když prošel v poli párů název / hodnota, jako jsou:

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

Konkrétně některé z těchto hodnot může být dobrovolné, tak jak byste nastavení výchozí a pak přepsat jim v případě, že dvojice název / hodnota byla předána v průběhu init.

Položena 04/02/2009 v 22:32
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
0

Dalo by se použít ternární operátor zjistit, zda je nastavena prvkem inicializace pole a používat ji, pokud to je, nebo použít výchozí nastavení, pokud ne. Například za předpokladu, že data inicializace je předán jako objekt s názvem init....

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

Nebo můžete jen zkopírovat init pole přepíše dříve nastavené hodnoty

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

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

Všimněte si, že jako idiom

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

Selže, pokud je opts.foo nastavena na hodnotu, která vyhodnocuje na hodnotu false, např 0

Odpovězeno 04/02/2009 v 22:36
zdroj uživatelem

hlasů
1

oh Podívejme

edit: aktualizováno, to vlastně funguje

 
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";
}
Odpovězeno 04/02/2009 v 22:39
zdroj uživatelem

hlasů
7

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

    if (!this.bar) raiseSomeError();
  }
}
Odpovězeno 04/02/2009 v 22:40
zdroj uživatelem

hlasů
4

Nejčistší způsob, jak mohu myslet, by bylo použít objekt výchozích hodnot, který obsahuje všechny výchozí vlastností takto:

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

Dalo by se dokonce iteraci přes výchozí objekt pomocí smyčky for, takže nemusíte sledovat, jaké vlastnosti chcete objekt obsahovat.

Byste měli používat „in“ operátora, protože je možné, aby skutečně nastavit hodnotu majetku nedefinovaná. To platí pro nastavení objektů nedefinovaný a v tomto případě je skutečně považován za set, jediný způsob, jak zajistit, že hodnota nebyla nastavena, je zkontrolovat, že není v objektu vůbec.

Odpovězeno 04/02/2009 v 22:53
zdroj uživatelem

hlasů
4

To testuje ok na FF5, IE8, Chrome 12, Opera v11.5. Nezáleží na tom, jaké jsou standardní hodnoty, budou přepsány, pokud jejich Klíčem k úspěchu je v seznamu volání, pokud ne budou o samotě.

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"} )
Odpovězeno 04/07/2011 v 15:26
zdroj uživatelem

hlasů
2

ještě lépe, dostat metodu init mimo objekt, takže můžete použít init pro jiné objekty.

To testuje ok na FF5, IE8, Chrome 12, Opera v11.5. Nezáleží na tom, jaké jsou standardní hodnoty, budou přepsány, pokud jejich Klíčem k úspěchu je v seznamu volání, pokud ne budou o samotě.

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"} )
Odpovězeno 04/07/2011 v 15:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more