**译者按: ** 这篇博客将介绍ES6新增的Object.assign()方法。javascript
为了保证可读性,本文采用意译而非直译。另外,本文版权归原做者全部,翻译仅用于学习。html
将A对象的属性复制给B对象,这是JavaScript编程中很常见的操做。这篇博客将介绍ES6的**Object.assign()**属性,能够用于对象复制。java
在JavaScript生态系统中,对象复制有另一个术语: extend。下面是两个JS库提供的extend接口:es6
ES6提供了Object.assign(),用于合并/复制对象的属性。express
Object.assign(target, source_1, ..., source_n)
它会修改target对象,而后将它返回:先将source_1对象的全部可枚举属性复制给target,而后依次复制source_1等的属性。编程
在ES6中,对象的属性名能够是字符串或者Symbol。由于Symbol值具备惟一性,这就意味着Symbol做为对象的属性名时,能够保证不会出现同名的属性。对象属性名为字符串或者Symbol时,**Object.assign()**都支持。小程序
target对象的属性是经过复制来建立的,这就意味着,若是target有setters方法时,它们将会被调用。微信小程序
另外一种方案是经过定义来实现,这样将会建立新的自有属性,不会调用setters方法。其实,另外一个版本的**Object.assign()**的提案正是采用这种方法。不过,这个提议在ES6中被拒绝了,也许以后的版本会再考虑。微信
构造器正是为了初始化对象的属性,一般,咱们不得很少次重复属性的名字。示例代码的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 }的缩写。
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) { //... } });
使用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}
###关于Fundebug
Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,获得了Google、360、金山软件、百姓网等众多知名用户的承认。欢迎免费试用!
转载时请注明做者Fundebug以及本文地址: