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 相关文章推荐
js下通过prototype扩展实现indexOf的代码
Dec 08 Javascript
JSON.parse()和JSON.stringify()使用介绍
Jun 20 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
EsLint入门学习教程
Feb 17 Javascript
原生JS实现不断变化的标签
May 22 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
详解vue组件基础
May 04 Javascript
vue 中的keep-alive实例代码
Jul 20 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
Aug 10 Javascript
vue+django实现下载文件的示例
Mar 24 Vue.js
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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
javascript下function声明一些小结
2007/12/28 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
JavaScript运算符小结
2015/06/03 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
Angular.js之作用域scope'@','=','&'实例详解
2017/02/28 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
Angular实现表单验证功能
2017/11/13 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python二分查找详解
2015/09/13 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
Ref与out有什么不同
2012/11/24 面试题
结构和类有什么异同
2012/07/16 面试题
abstract class和interface有什么区别
2013/08/04 面试题
人事行政主管岗位职责
2015/04/09 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书