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获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
JavaScript中继承的一些示例方法与属性参考
Aug 07 Javascript
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
Dec 25 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
Web安全之XSS攻击与防御小结
Dec 13 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
Jun 28 Javascript
详解如何使用Node.js实现热重载页面
May 06 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 memcache扩展的三种安装方法
2009/04/26 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
Python的Flask开发框架简单上手笔记
2015/11/16 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
EM算法的python实现的方法步骤
2018/01/02 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
python中get和post有什么区别
2020/06/19 Python
利用Python优雅的登录校园网
2020/10/21 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
请说出几个常用的异常类
2013/01/08 面试题
Servlet的生命周期
2013/08/25 面试题
社区庆中秋节活动方案
2014/02/07 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
2014年节能工作总结
2014/12/18 职场文书
廉洁自律个人总结
2015/02/14 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电