На самом деле, нет.
В зависимости от того, что вам действительно нужно, одна из возможностей может заключаться в установке oв качестве прототипа нового объекта.
var o = {};
(function(x){
var obj = Object.create( x );
obj.foo = 'foo';
obj.bar = 'bar';
})(o);
alert( o.foo );
Таким образом, никакие свойства, которые вы добавляете obj, не будут добавлены o. Любые свойства, добавленные objс тем же именем свойства, что и свойство в, oбудут затенять oсвойство.
Конечно, любые добавленные свойства oбудут доступны из, objесли они не затенены, и все объекты, которые есть oв цепочке прототипов, будут видеть те же обновления o.
Кроме того, если objесть свойство, которое ссылается на другой объект, например массив, вам нужно обязательно затенять этот объект перед добавлением членов к объекту, в противном случае эти элементы будут добавлены objи будут совместно использоваться всеми объектами, которые есть objв цепочке прототипов.
var o = {
baz: []
};
(function(x){
var obj = Object.create( x );
obj.baz.push( 'new value' );
})(o);
alert( o.baz[0] );
Здесь вы можете видеть, что, поскольку вы не затеняли массив в bazon oс включенным bazсвойством obj, o.bazмассив изменяется.
Поэтому вместо этого вам нужно сначала затенить его:
var o = {
baz: []
};
(function(x){
var obj = Object.create( x );
obj.baz = [];
obj.baz.push( 'new value' );
})(o);
alert( o.baz[0] );