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 相关文章推荐
jquery设置按钮停顿3秒不可用
Mar 07 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
Mar 09 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
JavaScript实现审核流程状态的动态显示进度条
Mar 15 Javascript
vue实现全选、反选功能
Nov 17 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
Jan 12 Javascript
浅谈Webpack下多环境配置的思路
Jun 27 Javascript
js实现无限瀑布流实例方法
Sep 16 Javascript
小程序接口的promise化的实现方法
Dec 11 Javascript
微信小程序转化为uni-app项目的方法示例
May 22 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
消息持续发送的完整例子
2006/10/09 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
php文件操作相关类实例
2015/06/18 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
jquery获取元素索引值index()示例
2014/02/13 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python3 中文文件读写方法
2018/01/23 Python
基于python实现名片管理系统
2018/11/30 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
Python简单实现区域生长方式
2020/01/16 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
社区学习雷锋活动总结
2014/04/25 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书