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多种数据类型表格排序代码分析
Sep 11 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
div模拟选择框示例代码
Nov 03 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
Jul 17 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
基本DOM节点操作
Jan 17 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
es6中比较有用的7个技巧小结
Jul 12 Javascript
a标签调用js的方法总结
Sep 05 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 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转成EXE文件
2006/10/09 PHP
PHP+javascript液晶时钟
2006/10/09 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
vue实现评论列表功能
2019/10/25 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
Python简单实现enum功能的方法
2016/04/25 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
死亡赔偿协议书
2015/01/28 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
校园安全主题班会
2015/08/12 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
如何使用SQL Server语句创建表
2022/04/12 SQL Server
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android