ES6中新增的Object.assign()方法详解

前言

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

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

Prototype:

Underscore.js:

object.assign()介绍

ES6提供了object.assign() ,用于合并/复制对象的属性

rush:js;"> 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均重复了两次:

rush:js;"> class Point { constructor(x,y) { this.x = x; this.y = y; } }

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

rush:js;"> class Point { constructor(this.x,this.y){} }

至少,object.assign()可以帮助我们减少一些重复:

rush:js;"> 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关键字定义对象的新增方法

rush:js;"> MyClass.prototype.foo = function(arg1,arg2) { //... };

在ES6中,对象方法的定义更加简洁,不需要使用function关键字。这时,可以使用object.assign()为对象新增方法

rush:js;"> Object.assign(MyClass.prototype,{ foo(arg1,arg2) { //... } });

3. 复制对象

使用object.assign()深度复制对象,包括其prototype

rush:js;"> 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}

仅复制自身属性

rush:js;"> 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}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持

参考

原文:

译者: nofollow" target="_blank" href="https://fundebug.com/">Fundebug

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...