ES6中新增的Object.assign()方法详解


Posted in Javascript onSeptember 22, 2017

前言

将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

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

译者: Fundebug

Javascript 相关文章推荐
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
Apr 13 Javascript
用Jquery实现多级下拉框无刷新的联动
Dec 22 Javascript
JQquery的一些使用心得分享
Aug 01 Javascript
使用jquery mobile做幻灯播放效果实现步骤
Jan 04 Javascript
bootstrap table单元格新增行并编辑
May 19 Javascript
js简易版购物车功能
Jun 17 Javascript
JavaScript之Canvas_动力节点Java学院整理
Jul 04 Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
JavaScript的词法结构精华篇
Oct 17 Javascript
vue实现计步器功能
Nov 01 Javascript
VUEX采坑之路之获取不到$store的解决方法
Nov 08 Javascript
在react中使用vue的状态管理的方法示例
May 02 Javascript
Vee-Validate的使用方法详解
Sep 22 #Javascript
Js中async/await的执行顺序详解
Sep 22 #Javascript
Node.js自定义实现文件路由功能
Sep 22 #Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 #Javascript
javascript计算渐变颜色的实例
Sep 22 #Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 #Javascript
原生JS实现日历组件的示例代码
Sep 22 #Javascript
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP时间戳使用实例代码
2008/06/07 PHP
php 动态添加记录
2009/03/10 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
一个简单的php路由类
2016/05/29 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue实现计步器功能
2019/11/01 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
python实现查询IP地址所在地
2015/03/29 Python
使用Python对Access读写操作
2017/03/30 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
Django之PopUp的具体实现方法
2019/08/31 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
函授自我鉴定
2013/11/06 职场文书
上班看电影检讨书
2014/02/12 职场文书
绿色环保标语
2014/06/12 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL