Puedo objetivo de múltiples objetos con una sola operación utilizando ECMAScript es `con` declaración?

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

Pregunta

La siguiente no funciona (a pesar de que no da explícito de error), pero por qué no?

Y...Hay realmente no hay manera a su alrededor, el uso estricto del con la declaración de?Olvidar el uso de / foreach.

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

editar: Lo siento a hacer 2 preguntas en 1.Voy a tratar de hacerlo más claro:

  1. ¿Por qué el código anterior no da error de sintaxis, no funciona, pero es aceptada por with?

  2. Si es posible, ¿cómo podríamos cambiar varios objetos con el mismo atributo mediante with?

Esperemos que el siguiente ejemplo va a ser más claro en lo que quería lograr:

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
¿Fue útil?

Solución

La introducción de multi-objeto, ámbito de aplicación con with

Esto es lo que me originalmente pensaba que eran después, ya que no había especificado qué los resultados esperados fueron.Sólo la pila de la with declaraciones:

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

var value = 4;

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

alert(object1.attribute);

Naturalmente, el objeto introducido por el interior de la mayoría de los with anula idénticamente propiedades con nombre en cualquier alcance externo, incluidos los del exterior with las declaraciones.

Descargos de responsabilidad estándar se aplican a los golpes de rendimiento y el potencial de errores causados por el uso de with.Tenga en cuenta que su ejemplo se muestra el acceso a la propiedad de prefijo . dentro del bloque, pero esto es incorrecto, with modifica el ámbito de aplicación, temporalmente poner un objeto en la parte delantera de la resolución de la cadena, así que no hay prefijo es necesario (o permitido).


La orientación de múltiples objetos

Con respecto a su edición:el operador coma le permite escribir algo que aparece para pasar varias expresiones para with, pero realmente sólo pasa uno de ellos.No vas a ser capaz de conseguir lo que quiere sin algún tipo de multidifusión delegado de la ejecución (lo que implica un bucle);JavaScript/ECMAScript no tienen ningún construido-en medio de la modificación de varias propiedades / llamar a múltiples métodos con una sola asignación / llamada.

Quick 'n' sucio aplicación:

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

Otros consejos

También puede usar una referencia al objeto si desea acortar su código:

var o1 = object1
,   o2 = object2
;
o1.attribute = value;
o2.method();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top