マルチオブジェクトスコープの導入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);