bal*_*ton 134 javascript ecmascript-6
我厌倦了总是不得不写这样的代码:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果我不想自己编写代码,请实现一个已经完成的代码库.当然ES6 +即将救援上,这将提供给我们的东西,如一个Object.prototype.extend(obj2...)
或Object.extend(obj1,obj2...)
那么ES6 +提供这样的功能呢?如果还没有,那么这样的功能是否有计划?如果没有计划,为什么不呢?
Jac*_*ack 199
您可以使用Object.assign在ES6中进行浅合并/扩展/分配:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
句法:
Object.assign(target,... sources);
其中... sources表示源对象.
注意:不要将语法定义中的...源与ES6扩展运算符混淆.
例:
var obj1 = {name: 'Daisy', age: 30};
var obj2 = {name: 'Casey'};
Object.assign(obj1, obj2);
console.log(obj1.name === 'Casey' && obj1.age === 30);
// true
Run Code Online (Sandbox Code Playgroud)
Thi*_*man 149
您可以使用对象休息/传播:
const merged = {...obj1, ...obj2}
Run Code Online (Sandbox Code Playgroud)
ECMAScript 提案目前处于第3阶段,并通过使用阶段3预设在Babel中启用.
Sal*_*kar 12
我知道这是一个老问题,但ES2015/ES6中最简单的解决方案实际上非常简单,使用Object.assign(),
希望这有帮助,这也是DEEP合并:
/**
* Simple is object check.
* @param item
* @returns {boolean}
*/
export function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}
/**
* Deep merge two objects.
* @param target
* @param source
*/
export function mergeDeep(target, source) {
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return target;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
Run Code Online (Sandbox Code Playgroud)
加Object.mixin
目前正在讨论照顾你所要求的行为.https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html
虽然它还没有进入ES6草案,但似乎有很多支持,所以我认为它很快就会出现在草稿中.
Object.assign(o1,o2) ;
Object.assign({},o1,o2) ; //safe inheritance
var copy=Object.assign({},o1); // clone o1
//------Transform array of objects to one object---
var subjects_assess=[{maths:92},{phy:75},{sport:99}];
Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}
Run Code Online (Sandbox Code Playgroud)
{...o1,...o2} // inheritance
var copy= {...o1};
Run Code Online (Sandbox Code Playgroud)
也许ES5 Object.defineProperties
方法可以完成这项工作吗?
例如
var a = {name:'fred'};
var b = {age: {value: 37, writeable: true}};
Object.defineProperties(a, b);
alert(a.age); // 37
Run Code Online (Sandbox Code Playgroud)
MDN文档:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties
归档时间: |
|
查看次数: |
75085 次 |
最近记录: |