ES6之Object.assign()详解
来源:互联网 发布:u3d 粒子特效优化 编辑:程序博客网 时间:2024/05/22 08:09
译者按: 这篇博客将介绍ES6新增的Object.assign()方法。
- 原文: ECMAScript 6: merging objects via Object.assign()
- 译者: Fundebug
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
将A对象的属性复制给B对象,这是JavaScript编程中很常见的操作。这篇博客将介绍ES6的Object.assign()属性,可以用于对象复制。
在JavaScript生态系统中,对象复制有另外一个术语: extend。下面是两个JS库提供的extend接口:
- Prototype: Object.extend(destination, source)
- Underscore.js: _.extend(destination, *sources)
Object.assign()介绍
ES6提供了Object.assign(),用于合并/复制对象的属性。
Object.assign(target, source_1, ..., source_n)
它会修改target对象,然后将它返回:先将source_1对象的所有可枚举属性复制给target,然后依次复制source_1等的属性。
1. 属性名可以为字符串或者Symbol
在ES6中,对象的属性名可以是字符串或者Symbol。因为Symbol值具有唯一性,这就意味着Symbol作为对象的属性名时,可以保证不会出现同名的属性。对象属性名为字符串或者Symbol时,Object.assign()都支持。
2. 属性复制通过赋值实现
target对象的属性是通过复制来创建的,这就意味着,如果target有setters方法时,它们将会被调用。
另一种方案是通过定义来实现,这样将会创建新的自有属性,不会调用setters方法。其实,另一个版本的Object.assign()的提案正是采用这种方法。不过,这个提议在ES6中被拒绝了,也许之后的版本会再考虑。
Object.assign()使用示例
1. 初始化对象属性
构造器正是为了初始化对象的属性,通常,我们不得不多次重复属性的名字。示例代码的constructor中,x与y均重复了两次:
class Point{ constructor(x, y) { this.x = x; this.y = y; }}
如果可以的话,个人偏爱将所有冗余都省去。(事实上,CoffeeScript与TypeScript都有语法解决构造器中属性名重复的问题。):
class Point{ constructor(this.x, this.y){}}
至少,Object.assign()可以帮助我们减少一些重复:
class Point{ constructor(x, y) { Object.assign(this, { x, y }); }}
在ES6中, { x, y }为{ x: x, y: y }的缩写。
2. 为对象添加方法
ECMAScript 5, you use a function expression to add a method to an object:
在ES5中,需要使用function关键字定义对象的新增方法:
MyClass.prototype.foo = function(arg1, arg2){ //...};
在ES6中,对象方法的定义更加简洁,不需要使用function关键字。这时,可以使用Object.assign()为对象新增方法:
Object.assign(MyClass.prototype,{ foo(arg1, arg2) { //... }});
3. 复制对象
使用Object.assign()深度复制对象,包括其prototype
var Point = function(x){ this.x = x;}Point.prototype.y = 2;var obj = new Point(1);var copy = Object.assign({ __proto__: obj.__proto__ }, obj); // 输出{x:1,y:2} console.log(copy) // 输出{x:1,y:2}
仅复制自身属性:var Point = function(x){ this.x = x;}Point.prototype.y = 2;var obj = new Point(1);var copy = Object.assign({}, obj); console.log(copy) // 输出{x:1}
参考
- Object properties in JavaScript
- Properties in JavaScript: definition versus assignment
- Callable entities in ECMAScript 6
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/11/object-assign/
- ES6之Object.assign()详解
- ES6之Object.assign
- ES6 Object.assign()
- es6 Object.assign
- Object.assign() 方法详解
- es6 javascript对象方法Object.assign()
- es6 javascript对象方法Object.assign()
- es6 javascript对象方法Object.assign()
- ES6-对象的扩展-Object.assign()
- es6 javascript对象方法Object.assign()
- node之object-assign
- Javascript之Object.assign()
- deepClone, extend, 深克隆对象和Object.assign(ES6)
- Object.assign()
- Object.assign
- Object.assign()
- Object.assign()
- javascript之Object.assign()痛点
- java后台处理/Date()/格式时间戳
- 普通dijkstra(邻接矩阵)
- centos7安装docker
- 后端接口的幂等性
- HAUT1289 arufuonsusnoufura(区间dp,河南省多校连萌(七))
- ES6之Object.assign()详解
- 浏览器渲染页面原理
- SGISTL源码探究-list容器(上)
- 7. Reverse Integer
- GitChat · 人工智能 | 用语音和自然语言控制智能家居——实例分享
- 学生管理系统(文件流)
- butterknife----黄油刀
- Java 空字符串“”和null区别
- 优秀工程师必备的十大能力!