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学习笔记 nt-child的使用
Jan 17 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
Javascript 实现的数独解题算法网页实例
Oct 15 Javascript
JS cookie中文乱码解决方法
Jan 28 Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
Dec 27 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 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 不使用js实现页面跳转
2014/02/11 PHP
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
javascript每日必学之继承
2016/02/23 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
pymysql的简单封装代码实例
2020/01/08 Python
tensorflow 模型权重导出实例
2020/01/24 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
儿科护士实习自我鉴定
2013/10/17 职场文书
实习生个人找工作的自我评价
2013/10/30 职场文书
就业自荐书
2013/12/05 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
初中同学会活动方案
2014/08/22 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书