文档章节

ES6之Object.assign()详解

Fundebug
 Fundebug
发布于 2017/09/11 13:14
字数 936
阅读 7
收藏 1

**译者按: ** 这篇博客将介绍ES6新增的Object.assign()方法。

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

将A对象的属性复制给B对象,这是JavaScript编程中很常见的操作。这篇博客将介绍ES6的**Object.assign()**属性,可以用于对象复制。

在JavaScript生态系统中,对象复制有另外一个术语: extend。下面是两个JS库提供的extend接口:

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对象的属性是通过复制来创建的,这就意味着,如果targetsetters方法时,它们将会被调用。

另一种方案是通过定义来实现,这样将会创建新的自有属性,不会调用setters方法。其实,另一个版本的**Object.assign()**的提案正是采用这种方法。不过,这个提议在ES6中被拒绝了,也许之后的版本会再考虑。

Object.assign()使用示例

1. 初始化对象属性

构造器正是为了初始化对象的属性,通常,我们不得不多次重复属性的名字。示例代码的constructor中,xy均重复了两次:

class Point
{
    constructor(x, y)
    {
        this.x = x;
        this.y = y;
    }
}

如果可以的话,个人偏爱将所有冗余都省去。(事实上,CoffeeScriptTypeScript都有语法解决构造器中属性名重复的问题。):

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} 

参考

###关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

版权声明:

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2017/09/11/object-assign/

© 著作权归作者所有

共有 人打赏支持
Fundebug
粉丝 6
博文 126
码字总数 193991
作品 0
厦门
私信 提问
ES6 对象的扩展

一、对象属性的简洁写法 1、属性简写 2、方法简写 二、属性名表达式 在ES5中,定义对象的属性有两种方法 如果使用字面量方式定义对象,在ES5中只能使用方法一,而在ES6中可以使用方法二: 属...

贵在随心
01/16
0
0
react+webpack构建步骤

一、安装全局组件 用于转译 es6、react 到 es5,打包工程,启动 webpack-dev-server 服务 npm install babel-core babel-loader babel-preset-es2015 babel-preset-react webpack-dev-serve......

阿祥_开源中国
2016/10/12
39
0
【JavaScript】对象的浅拷贝与深拷贝

前言 在 JavaScript 中,对象可谓是一个非常主要的知识点。什么原型链啊,拷贝啊,继承啊,创建啊等等等等。在我之前的文章中已经对对象的创建和继承做了一个简单的介绍,【JavaScript】ES5...

眼已望穿
07/30
0
0
想写出优雅的代码?试试这些ES6小tips

最近又重温了ES6的文档,发现除了箭头函数,解构赋值,扩展运算符这样常用的语法外,还有很多很给力的方法,不仅使代码更简洁,还可以提高代码的健壮性,更令我意外的是,浏览器兼容大部分的...

whuzxq
07/17
0
0
ES6对对象的拓展(2018-05-08)

对象的传统表示法 let person = { "name":"张三", "say":function(){ alert("你好吗?"); } } ES6中的简洁写法 var name = "Zhangsan"; var age = 12; //传统的属性写法 var person = { "na......

a小磊_
05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
4
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
10
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
12
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
6
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部