Posso indirizzare più oggetti con un'unica operazione usando l'istruzione `with` di ECMASCRICIO?
-
28-10-2019 - |
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:
Perché il codice sopra non fornisce alcun errore di sintassi, non funziona ma è accettato da
with
?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
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();