Могу ли я нацелиться на несколько объектов с помощью одной операции, используя оператор Ecmascript `with`?

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

Вопрос

Следующее не работает (хотя это не дает явной ошибки), но Почему нет?

И ... есть Действительно ни за что вокруг него, строго используя с заявлением? Забывать Использование для / foreach.

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

редактировать: Извините за то, что запустил 2 вопроса в 1. Я постараюсь прояснить это:

  1. Почему приведенный выше код не дает синтаксической ошибки, не работает, но принимается with?

  2. Если это возможно, как мы можем изменить несколько объектов с тем же атрибутом, используя 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top