Могу ли я нацелиться на несколько объектов с помощью одной операции, используя оператор Ecmascript `with`?
-
28-10-2019 - |
Вопрос
Следующее не работает (хотя это не дает явной ошибки), но Почему нет?
И ... есть Действительно ни за что вокруг него, строго используя с заявлением? Забывать Использование для / foreach.
with (object1, object2) {
attribute = value;
method();
}
редактировать: Извините за то, что запустил 2 вопроса в 1. Я постараюсь прояснить это:
Почему приведенный выше код не дает синтаксической ошибки, не работает, но принимается
with
?Если это возможно, как мы можем изменить несколько объектов с тем же атрибутом, используя
with
?
Надеемся, что следующий пример будет более четким в том, чего я хотел достичь:
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
Решение
Введение многообъективного объема с with
Это то, что я первоначально Думал, что вы преследовали, так как вы не указали, каковы были ваши ожидаемые результаты. Просто сложите with
заявления:
var object1 = { attribute: 3 };
var object2 = { method: function() { alert('blah'); } };
var value = 4;
with (object1)
with (object2)
{
attribute = value;
method();
}
alert(object1.attribute);
Естественно, объект, введенный внутренним with
будет переопределять идентично названные свойства в любом внешнем масштабе, в том числе из внешнего with
заявления.
Применяются стандартные отказы от ответственности в отношении хитов производительности и потенциала ошибок, вызванных использованием with
. Анкет Обратите внимание, что в вашем примере показан доступ к свойствам .
внутри блока, но это неправильно - with
изменяет объем, временно помещая объект в передней части цепочки разрешения, поэтому префикс не требуется (или разрешено).
Нацеливание на несколько объектов
Относительно вашего редактирования: оператор запятой Позволяет написать что -нибудь, что появляется передать несколько выражений with
, но на самом деле только один из них. Вы не сможете выполнить то, что вы хотите, без какой -либо реализации Multicast Delegate (которая включает в себя цикл); JavaScript / Ecmascript не имеет никаких встроенных средств изменения нескольких свойств / вызова нескольких методов с помощью одного назначения / вызова.
Quick 'n' Dirty Realation:
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;
}
};
Применение:
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);
Другие советы
Вы также можете использовать ссылку на объект, если хотите сделать свой код короче:
var o1 = object1
, o2 = object2
;
o1.attribute = value;
o2.method();