专栏名称: Fundebug
Fundebug为JavaScript、微信小程序及Node.js开发团队提供专业的线上代码bug监控和智能分析服务。
目录
相关文章推荐
前端之巅  ·  80人小团队,限时任务!NYPL如何用Nex ... ·  4 天前  
程序员鱼皮  ·  教程老了,被吐槽了! ·  昨天  
前端早读课  ·  【早阅】AI 编程工具如何改变开发者的时间分配 ·  2 天前  
前端早读课  ·  【第3419期】vivo ... ·  3 天前  
前端大全  ·  大家都该学学的埋点概念与使用 ·  6 天前  
51好读  ›  专栏  ›  Fundebug

ES6之Object.assign()详解

Fundebug  · 公众号  · 前端  · 2017-09-11 09:11

正文

译者按: 这篇博客将介绍ES6新增的Object.assign()方法。


  • 原文: ECMAScript 6: merging objects via Object.assign()

  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

将A对象的属性复制给B对象,这是JavaScript编程中很常见的操作。这篇博客将介绍ES6Object.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对象的属性是通过复制来创建的,这就意味着,如果targetsetters方法时,它们将会被调用。

另一种方案是通过定义来实现,这样将会创建新的自有属性,不会调用setters方法。其实,另一个版本的Object.assign()的提案正是采用这种方法。不过,这个提议在ES6中被拒绝了,也许之后的版本会再考虑。

Object.assign()使用示例

1. 初始化对象属性

构造器正是为了初始化对象的属性,通常,我们不得不多次重复属性的名字。示例代码的constructor中,xy均重复了两次:


class Point

{

constructor(x, y)

{

this.x = x;

this.y = y;

}

}


如果可以的话,个人偏爱将所有冗余都省去。(事实上,CoffeeScriptTypeScript都有语法解决构造器中属性名重复的问题。):


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保留原文地址并且附上Fundebug公众号的二维码。否则,我们将委托相关机构追诉法律责任。