0

以下は機能しません (ただし、明示的なエラーは発生しません) 。なぜでしょうか?

そして... with ステートメントを厳密に使用して、本当にそれを回避する方法はありませんか? for / 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
4

2 に答える 2

6

マルチオブジェクトスコープの導入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 には、複数のプロパティを変更したり、単一の割り当て/呼び出しで複数のメソッドを呼び出したりする組み込みの手段がありません。

クイック '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;
  }
};

使用法:

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);
于 2011-05-02T21:49:32.160 に答える
2

コードを短くしたい場合は、オブジェクトへの参照を使用することもできます。

var o1 = object1
,   o2 = object2
;
o1.attribute = value;
o2.method();
于 2011-05-02T21:50:23.410 に答える