Puis-je cibler plusieurs objets avec une seule opération en utilisant la déclaration `with` de ECMAScript?

StackOverflow https://stackoverflow.com/questions/5862837

Question

Ce qui suit ne fonctionne pas (même si elle ne donne aucune erreur explicite), mais pourquoi pas?

Et ... Y at-il vraiment aucun moyen autour, en utilisant strictement le avec déclaration ? Oubliez en utilisant pour / foreach .

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

modifier Désolé pour faire 2 questions 1. Je vais essayer de le rendre plus clair:

  1. Pourquoi le code ci-dessus donne aucune erreur de syntaxe, ne fonctionne pas, mais est acceptée par with?

  2. S'il est possible, comment pourrions-nous modifier plusieurs objets avec la même attribut à l'aide with?

Espérons que l'exemple suivant sera plus clair sur ce que je voulais accomplir:

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
Était-ce utile?

La solution

Présentation de portée multi-objet avec with

Voici ce que je à l'origine pensiez que vous étiez après, puisque vous ne précisaient pas quels sont vos résultats attendus étaient. pile Juste les déclarations de with:

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

var value = 4;

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

alert(object1.attribute);

Bien entendu, l'objet introduit par l'intérieur le plus with remplacera les propriétés de même nom dans une portée externe, y compris ceux des déclarations de with extérieures.

dénis standard s'appliquent en ce qui concerne la performance et de succès potentiel des erreurs causées par l'utilisation de with. Notez que votre exemple montre l'accès aux propriétés préfixé par . dans le bloc, ce qui est faux -. with SCOPE modifie, en mettant temporairement un objet à l'avant de la chaîne de résolution, donc pas de préfixe est nécessaire (ou autorisé)


Ciblage plusieurs objets

En ce qui concerne votre edit: l'opérateur virgule vous permet d'écrire quelque chose qui apparaît pour passer plusieurs expressions à with, mais passe vraiment que l'un d'eux. Tu ne vas pas être en mesure d'accomplir ce que vous voulez sans une sorte de mise en œuvre du délégué multicast (qui implique une boucle); JavaScript / ECMAScript ne possède pas intégré dans les moyens de modifier plusieurs propriétés / appeler plusieurs méthodes avec une seule cession / appel.

Rapide et mise en œuvre sale:

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

Utilisation:

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

Autres conseils

Vous pouvez également utiliser une référence à l'objet si vous voulez rendre votre code plus court:

var o1 = object1
,   o2 = object2
;
o1.attribute = value;
o2.method();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top