文档章节

ES6之Object.assign()详解

Fundebug
 Fundebug
发布于 2017/09/11 13:14
字数 793
阅读 3
收藏 1
点赞 0
评论 0

**译者按: ** 这篇博客将介绍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以及本文地址:

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

© 著作权归作者所有

共有 人打赏支持
Fundebug
粉丝 3
博文 70
码字总数 95391
作品 0
厦门
ES6 对象的扩展

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

贵在随心 ⋅ 01/16 ⋅ 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 ⋅ 0

es6对象扩展

es6对于对象做了很多扩展,现做以下总结。 特性: ES6 允许直接写入变量和函数,作为对象的属性和方法。 Object.is()方法比较两个值是否严格相等,与===的不同之处在于,+0不等于-0;NaN等于...

tiancai啊呆 ⋅ 2017/10/06 ⋅ 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

前端面试之ES6篇(高产似母猪)

这也是前端面试经常询问的问题,经常问你es6出现了哪些新的特性,平时又使用过那些。在编写此教程的时候,第一句话往往就是面试常常问到的地方,然后后面就是他的详细解释,面试要求的内容我...

skychenbo ⋅ 2017/09/25 ⋅ 0

V8 4.5 发布,JavaScript 解析引擎

V8 4.5 发布,此版本直至 Chrome 45 Stable 之前都是 beta 版本。 值得关注的改进: 改进 ECMAScript 2015 (ES6) 支持(Arrow Functions,Array/TypedArray functions,Object.assign) 优化...

oschina ⋅ 2015/07/21 ⋅ 8

关于Safari 浏览器不兼容vuejs 的新属性-小总结

由于公司一个产品进入 TR2末端测试阶段。 我用mac 的 Safari 浏览器小心翼翼的打开我们产品 测试 本来以为,Safari 毕竟是mac家族 逼格高些,而且和 chrome 同出一家内核技术, 应该是最标准...

xllily_11 ⋅ 2016/12/30 ⋅ 0

es6中class类的全方面理解(一)

传统的javascript中只有对象,没有类的概念。它是基于原型的面向对象语言。原型对象特点就是将自身的属性共享给新对象。这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!...

张培跃 ⋅ 05/06 ⋅ 0

前端问题总汇

1、vue1.0到vue2.0的变化?组件之间如何通信? 2、webpack主要做了什么?怎么打包的? 3、模块化是做什么的?模块化解决了什么问题?模块化有什么优点呢? AMD、CMD、commonJS这些要了解,再...

xuhaoxin123 ⋅ 2017/11/20 ⋅ 0

WEB前端学习:了解ES6新特性

Web前端开发工程师是一个很新的职业,是从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行...

web前端小辰 ⋅ 06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 12分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 13分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 17分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 32分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 48分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 55分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部