通过引用扩展对象

时间:2013-04-05 21:26:10

标签: javascript

我有一个extend方法,可以像在JavaScript中一样扩展对象:

var objA = {a: true};
var objB = extend({b:false}, objA);
console.log(objB); // {a: true, b: false}

但是,我想通过引用将源(objA)属性扩展到目标(objB)对象上,以便对源进行的任何更改都会在事后反映在目标中,像这样:

var objA = {a: true};
var objB = extend({b: false}, objA);
console.log(objB); // {a: true, b:false}
objA.a = false;
console.log(objB); // {a: false, b:false}

例如,当您修改一个对象(总是通过引用分配)时,事情按照我希望的方式运行:

var objA = {A:{a: true}};
var objB = _.extend({b: false}, objA);
console.log(objB) // {A:{a:true}, b:false};
objA.A.a = false; 
console.log(objB); // {A:{a:false}, b:false};

换句话说,当对objA的非对象文字属性(或未通过引用分配的任何值)进行更改时,我希望这些更改能够反映在{{1}中}。

我很确定如果没有额外的辅助方法,这是不可能的,这种辅助方法取决于在对象发生变化时触发的某种对象监视方法。

思想?

objB方法的代码:

extend

2 个答案:

答案 0 :(得分:3)

这里提到的正是JavaScript的原型继承:

var objA = {a: false};
var objB = Object.create(objA);
objB.b = false;

console.log(objB.a, objB.b); // true, 
objA.a = false;
console.log(objB.a, objB.b); // false, false

当然如果objB覆盖a属性,您将丢失该链接,因为JavaScript会在对象a中找到属性objB,因此不会查看原型链。

使用ECMAScript 5方法,您可以使用extend函数:

function extend(properties, proto) {
  var object = Object.create(proto);
  var descriptor = {};

  Object.getOwnPropertyNames(properties).forEach(function(name) {
    descriptor[name] = Object.getOwnPropertyDescriptor(properties, name);
  });

  return Object.defineProperties(object, descriptor);
}


var objA = {a: true};
var objB = extend({b: false}, objA);
console.log(objB.a, objB.b); // true, false
objA.a = false;
console.log(objB.a, objB.b); // false, false

答案 1 :(得分:1)

Object.extend= function (properties,obj) {
            function F() { };
            F.prototype = obj;
            var newObj = new F();
            for (var prop in properties){
                 newObj[prop] = properties[prop];
            }
            return newObj;
        }