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 相关文章推荐
判断JavaScript对象是否可用的最正确方法分析
Oct 03 Javascript
jQuery Flash/MP3/Video多媒体插件
Jan 18 Javascript
JQuery中getJSON的使用方法
Dec 13 Javascript
jQuery图片播放8款精美插件分享
Feb 17 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
May 10 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
javascript中this的四种用法
May 11 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
Aug 18 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 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 CURL用法的深入分析
2013/06/09 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
php微信开发之图片回复功能
2018/06/14 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
python使用mysql数据库示例代码
2017/05/21 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python super()方法原理详解
2020/03/31 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
工作中的自我评价如何写好
2013/10/28 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
学生操行评语大全
2014/04/24 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
2015年招生工作总结
2015/05/04 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python