ECMAScriptの「with」ステートメントを使用して、単一の操作で複数のオブジェクトをターゲットにすることはできますか?

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

質問

以下は機能しません(ただし、明示的なエラーはありませんが)が どうして いいえ?

そして...そこにあります 本当にありません その周りで、厳密に使用しています 声明で?忘れる / foreachの使用.

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

編集: 1で2つの質問をして申し訳ありません。私はそれを明確にしようとします:

  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, 、しかし、実際にはそのうちの1つだけを通過します。ある種のマルチキャストデリゲートの実装(ループを含むもの)なしで、あなたが望むものを達成することはできません。 JavaScript / ecMascriptには、単一の割り当て /呼び出しで複数のプロパティを変更したり、複数のメソッドを呼び出すための組み込み手段がありません。

Quick 'n' Dirty実装:

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