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代码经典广告
Oct 21 Javascript
拖拉表格的JS函数
Nov 20 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
Mar 01 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
Jan 23 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 Javascript
Node调用Java的示例代码
Sep 20 Javascript
vue鼠标悬停事件实例详解
Apr 01 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
php csv操作类代码
2009/12/14 PHP
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
Python 解析XML文件
2009/04/15 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
tensorflow常用函数API介绍
2020/04/19 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
教导处工作制度
2014/01/18 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
保证书格式
2015/01/16 职场文书
工作失误检讨书范文
2015/01/26 职场文书
党支部工作总结2015
2015/04/01 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript