我有一个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
答案 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;
}