Puedo objetivo de múltiples objetos con una sola operación utilizando ECMAScript es `con` declaración?
-
28-10-2019 - |
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:
¿Por qué el código anterior no da error de sintaxis, no funciona, pero es aceptada por
with
?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
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();