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中的非对象值是按值传递的,而不是引用-重写这种行为可能会变得不必要的困难和毫无意义。你为什么不直接存储对对象的引用呢?事实上,这些对象就是引用,并且总是通过它们访问属性?是的,我关心的只是对象。我在构建服务管理器时注意到了这种行为,服务管理器正在创建和缓存对象实例,以减少实例化并允许在不使用全局注册表的情况下访问服务。