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 相关文章推荐
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
JS返回iframe中frameBorder属性值的方法
Apr 01 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
JS获取鼠标坐标位置实例分析
Jan 20 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
jQuery Position方法使用和兼容性
Aug 23 jQuery
JS路由跳转的简单实现代码
Sep 21 Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
JS模拟实现哈希表及应用详解
May 04 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
php下将XML转换为数组
2010/01/01 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
分享php分页的功能模块
2015/06/16 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
简单的js计算器实现
2016/10/26 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
pytest中文文档之编写断言
2019/09/12 Python
python实现学生成绩测评系统
2020/06/22 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
质量月口号
2014/06/20 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
员工给公司的建议书
2019/06/24 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
Python学习之包与模块详解
2022/03/19 Python