Domanda

Quanto segue non funziona (sebbene non fornisca alcun errore esplicito), ma perché non?

E ... c'è Davvero nessun modo intorno a esso, usando rigorosamente il con dichiarazione? Dimenticare Utilizzando per / foreach.

with (object1, object2) {
  attribute = value;
  method();
}

modificare: Mi dispiace fare 2 domande in 1. Proverò a renderlo più chiaro:

  1. Perché il codice sopra non fornisce alcun errore di sintassi, non funziona ma è accettato da with?

  2. Se è possibile, come potremmo cambiare più oggetti con lo stesso attributo usando with?

Spero che il seguente esempio sarà più chiaro su ciò che volevo realizzare:

var object1 = { attribute: 3 };
var object2 = { attribute: 2, method: function() { alert('blah'); } };
var object3 = { method: function() {alert('bleh'); } };

var value = 4;

with (object1) 
with (object2) 
with (object3) 
{
  attribute = value;
  method();
}

alert(object1.attribute + object2.attribute);

// resulting alerts should be, in order: blah, bleh, 8
È stato utile?

Soluzione

Presentazione di ambito multi-oggetto con with

Questo è ciò che io originariamente Pensavo di essere dopo, dal momento che non avevi specificato quali fossero i risultati previsti. Basta impilare il with Dichiarazioni:

var object1 = { attribute: 3 };
var object2 = { method: function() { alert('blah'); } };

var value = 4;

with (object1) 
with (object2) 
{
  attribute = value;
  method();
}

alert(object1.attribute);

Naturalmente, l'oggetto introdotto dal più interno with Sostituirà le proprietà in modo identico in qualsiasi ambito esterno, comprese quelle dell'esterno with dichiarazioni.

Le dichiarazioni di non responsabilità si applicano in merito ai colpi delle prestazioni e al potenziale per gli errori causati dall'uso di with. Si noti che il tuo esempio mostra l'accesso alla proprietà prefisso da . All'interno del blocco, ma questo non è corretto - with Modifica l'ambito, mettendo temporaneamente un oggetto nella parte anteriore della catena di risoluzione, quindi non è necessario alcun prefisso (o consentito).


Mirare a più oggetti

Per quanto riguarda la tua modifica: il Operatore di virgole Ti permette di scrivere qualcosa che appare per passare più espressioni a with, ma in realtà passa solo uno di loro. Non sarai in grado di realizzare ciò che vuoi senza una sorta di implementazione delegata multicast (che coinvolge loop); JavaScript / Ecmascript non ha alcun mezzo integrato per modificare più proprietà / chiamare più metodi con un singolo assegnazione / chiamata.

Implementazione rapida 'n' sporca:

function multicast()
{
  this.targets = Array.prototype.slice.call(arguments, 0);
}
multicast.prototype = {
  call: function(methodName)
  {
    var i;
    for (i=0; i<this.targets.length; ++i)
    {
      if ( this.targets[i][methodName] )
        this.targets[i][methodName].apply(this.targets[i],
          Array.prototype.slice.call(arguments, 1));
    }
  },
  set: function(propName, value)
  {
    var i;
    for (i=0; i<this.targets.length; ++i) 
      this.targets[i][propName] = value;
  }
};

Uso:

var object1 = { attribute: 3 };
var object2 = { attribute: 2, method: function() { alert('blah'); } };
var object3 = { method: function() {alert('bleh'); } };

var value = 4;

var delegate = new multicast(object1, object2, object3);
delegate.set('attribute', value);
delegate.call('method');

alert(object1.attribute + object2.attribute);

Altri suggerimenti

Puoi anche usare un riferimento all'oggetto se si desidera rendere il tuo codice più breve:

var o1 = object1
,   o2 = object2
;
o1.attribute = value;
o2.method();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top