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入门基础之私有变量
Feb 23 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
jquery实现简单的无缝滚动
Apr 15 Javascript
轻量级javascript 框架Backbone使用指南
Jul 24 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 Javascript
记一次用ts+vuecli4重构项目的实现
May 21 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
JavaScript学习笔记(十)
2010/01/17 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python编写一个闹钟功能
2017/07/11 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python中update的基本使用方法详解
2019/07/17 Python
Python多进程编程常用方法解析
2020/03/26 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
商铺门前三包责任书
2014/07/25 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android