Frage

Das Folgende funktioniert nicht (obwohl es keinen expliziten Fehler gibt), aber warum nicht?

Und ... ist da Wirklich auf keinen Fall um ihn herum, strikt die Verwendung der mit Aussage? Vergessen Verwendung für / foreach.

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

bearbeiten: Tut mir leid, 2 Fragen in 1. Ich werde versuchen, es klarer zu machen:

  1. Warum der obige Code keinen Syntaxfehler enthält, funktioniert nicht, wird aber von akzeptiert von with?

  2. Wenn es möglich ist, wie können wir mehrere Objekte mit demselben Attribut mit demselben Attribut ändern? with?

Hoffentlich wird das folgende Beispiel klarer, was ich erreichen wollte:

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
War es hilfreich?

Lösung

Einführung von Multi-Objekt-Umfang mit with

Dies ist was ich ursprünglich Ich dachte, Sie wären danach, da Sie nicht angegeben hatten, was Ihre erwarteten Ergebnisse waren. Stapeln einfach die with Aussagen:

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

var value = 4;

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

alert(object1.attribute);

Natürlich wird das vom innersten eingeführte Objekt eingeführt with überschreibt identisch benannte Eigenschaften in jedem äußeren Bereich, einschließlich der der äußeren with Aussagen.

Standard -Haftungsausschlüsse gelten in Bezug with. Beachten Sie, dass Ihr Beispiel den Zugriff auf Eigenschaften zeigt, das von vorangestellt wurde . innerhalb des Blocks, aber das ist falsch - with Verändert den Umfang und platziert vorübergehend ein Objekt an der Vorderseite der Auflösungskette, sodass kein Präfix erforderlich (oder zulässig) ist.


Zielen auf mehrere Objekte

In Bezug auf Ihre Bearbeitung: die Komma -Betreiber Lassen Sie Sie etwas schreiben, das erscheint mehrere Ausdrücke an übergeben with, aber wirklich nur einen von ihnen. Sie werden nicht in der Lage sein, das zu erreichen, was Sie wollen, ohne eine Art Multicast -Delegierterimplementierung (eine, die das Schleifen beinhaltet). JavaScript / ECMascript verfügt nicht über integrierte Mittel zum Ändern mehrerer Eigenschaften / Aufrufe mehrerer Methoden mit einer einzelnen Zuordnung / Aufruf.

Schnelle 'n' schmutzige Implementierung:

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;
  }
};

Verwendungszweck:

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);

Andere Tipps

Sie können auch einen Verweis auf das Objekt verwenden, wenn Sie Ihren Code kürzer machen möchten:

var o1 = object1
,   o2 = object2
;
o1.attribute = value;
o2.method();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top