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多选项卡效果实例代码(附效果图)
Mar 23 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
简单的JS时钟实例讲解
Jan 13 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
Jun 01 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 Javascript
Vue使用Proxy监听所有接口状态的方法实现
Jun 07 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
JS实现json数组排序操作实例分析
Oct 28 Javascript
微信小程序实现购物车小功能
Dec 30 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导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
JS随机密码生成算法
2019/09/23 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python中比较两个列表的实例方法
2019/07/04 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
教师评语大全
2014/04/28 职场文书
机关保密承诺书
2014/06/03 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
培训计划通知
2015/07/15 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
sql注入报错之注入原理实例解析
2022/06/10 MySQL