以下是一个示例,展示了如何使用递归来扩展一个对象的属性,而无需显式地扩展路径中的每个对象:
function deepExtend(obj1, obj2) {
for (var key in obj2) {
if (obj2.hasOwnProperty(key)) {
if (typeof obj2[key] === 'object' && obj2[key] !== null) {
if (typeof obj1[key] === 'undefined') {
obj1[key] = {};
}
deepExtend(obj1[key], obj2[key]);
} else {
obj1[key] = obj2[key];
}
}
}
return obj1;
}
var obj1 = {
foo: {
bar: 'baz'
}
};
var obj2 = {
foo: {
baz: 'qux'
}
};
var extendedObj = deepExtend(obj1, obj2);
console.log(extendedObj); // 输出: { foo: { bar: 'baz', baz: 'qux' } }
在上面的示例中,我们定义了一个名为deepExtend
的函数,该函数接受两个参数obj1
和obj2
,并将obj2
中的属性递归地扩展到obj1
中。
在函数内部,我们使用for...in
循环遍历obj2
的属性。对于每个属性,我们首先检查它是否是obj2
自身的属性,以避免扩展原型链上的属性。
然后,我们检查当前属性的类型。如果它是一个对象并且不为null
,那么我们将递归调用deepExtend
函数来扩展obj1[key]
和obj2[key]
。
否则,如果该属性不是一个对象,我们直接将obj2[key]
的值赋给obj1[key]
。
最后,我们返回扩展后的obj1
对象。
在示例中,我们定义了两个对象obj1
和obj2
,它们都有一个名为foo
的属性。我们使用deepExtend
函数将obj2
的属性扩展到obj1
中,并将结果存储在extendedObj
变量中。最后,我们打印extendedObj
的值,以验证扩展是否成功。
运行上述代码将输出{ foo: { bar: 'baz', baz: 'qux' } }
,表明obj2
中的属性成功地扩展到了obj1
中。