引入多对象作用域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
,但实际上只传递其中一个。如果没有某种多播委托实现(涉及循环的实现),您将无法完成您想要的;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);