var o = {}; (function(x){ var obj = x; obj.foo = 'foo'; obj.bar = 'bar'; })(o)
o 将有.foo和.bar。
o
.foo
.bar
var o = {}; function Clone(x) { for(p in x) this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p]; } (function(x){ var obj = new Clone(x); obj.foo = 'foo'; obj.bar = 'bar'; })(o)
o 不会.foo或.bar。
并不是的。
根据你的实际需要,一个 可能性 可能是集o作为一个新的对象的原型。
var o = {}; (function(x){ var obj = Object.create( x ); obj.foo = 'foo'; obj.bar = 'bar'; })(o); alert( o.foo ); // undefined
因此,您添加到的任何属性obj都不会添加到中o。obj使用与中的属性相同的属性名称添加到的任何属性o都将阴影该o属性。
obj
当然,如果没有阴影,添加到的任何属性o都将可用obj,并且o原型链中所有对象的更新都将相同o。
另外,如果obj具有引用另一个对象的属性(例如Array),则需要确保在将该对象添加到对象之前将其遮蔽,否则,这些成员将添加到中obj,并将在所有对象之间共享有obj原型链。
var o = { baz: [] }; (function(x){ var obj = Object.create( x ); obj.baz.push( 'new value' ); })(o); alert( o.baz[0] ); // 'new_value'
在这里您可以看到,因为您没有使用bazon o的baz属性将on 遮蔽在Array 上obj,所以o.bazArray被修改了。
baz
o.baz
因此,您需要先对其进行阴影处理:
var o = { baz: [] }; (function(x){ var obj = Object.create( x ); obj.baz = []; obj.baz.push( 'new value' ); })(o); alert( o.baz[0] ); // undefined