JavaScript:替换维护外部引用的对象属性
我正在寻找一种很好的方法来替换对象的属性,同时维护对该属性的外部引用JavaScript:替换维护外部引用的对象属性,javascript,object,reference,Javascript,Object,Reference,我正在寻找一种很好的方法来替换对象的属性,同时维护对该属性的外部引用 var Foo = function(){ this.value = 'foo'; this.foo = 1; }; var Bar = function(){ this.value = 'bar'; this.bar = 1; }; var obj = { 'property': new Foo() }; var reference = obj.property; refe
var Foo = function(){
this.value = 'foo';
this.foo = 1;
};
var Bar = function(){
this.value = 'bar';
this.bar = 1;
};
var obj = {
'property': new Foo()
};
var reference = obj.property;
reference.value; // foo
obj.property = new Bar();
reference.value; // still foo...
你可以在行动中看到它
显然,这是预期的行为。通常您可能不希望引用被更改,但目前我希望
我提出了这个函数,但我正在寻找更优雅的东西
/**
* Replace an objects property maintaining external references
*
* @param {object} obj Object to replace the property on
* @param {string} key Key of the property to replace
* @param {mixed} replacement Value to use as replacement
* @author Robin Cafolla
* @date 2015-02-05
*/
function replaceProperty( obj, key, replacement ) {
var undefined;
for( var i in obj[key] ) {
obj[key][ i ] = undefined;
delete obj[key][ i ];
}
// Set prototype
Object.defineProperty( obj[key], 'prototype', {
enumerable: false,
configurable: true,
writable: true,
value: replacement
});
// Set constructor
Object.defineProperty( obj[key], 'constructor', {
enumerable: false,
configurable: true,
writable: true,
value: replacement.constructor
});
for (var k in replacement) {
obj[ key ][ k ] = replacement[ k ];
}
}
您可以看到它在工作javascript中的非对象值是按值传递的,而不是引用-重写这种行为可能会变得不必要的困难和毫无意义。你为什么不直接存储对对象的引用呢?事实上,这些对象就是引用,并且总是通过它们访问属性?是的,我关心的只是对象。我在构建服务管理器时注意到了这种行为,服务管理器正在创建和缓存对象实例,以减少实例化并允许在不使用全局注册表的情况下访问服务。