源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-10-15 21:02 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:ES6中新增的Object.assign()方法详解
[b]前言[/b] 将A对象的属性复制给B对象,这是JavaScript编程中很常见的操作。下面这篇文章将介绍ES6的Object.assign()属性,可以用于对象复制。 在JavaScript生态系统中,对象复制有另外一个术语: extend。下面是两个JS库提供的extend接口: Prototype: [url=http://prototypejs.org/doc/latest/language/Object/extend/]Object.extend(destination, source)[/url] Underscore.js: [url=http://underscorejs.org/#extend]_.extend(destination, *sources)[/url] [b]Object.assign()介绍[/b] ES6提供了[code]Object.assign()[/code] ,用于合并/复制对象的属性。
Object.assign(target, source_1, ..., source_n)
它会修改target对象,然后将它返回:先将source_1对象的所有可枚举属性复制给target,然后依次复制source_1等的属性。 [b]1. 属性名可以为字符串或者Symbol[/b] 在ES6中,对象的属性名可以是字符串或者Symbol。因为Symbol值具有唯一性,这就意味着Symbol作为对象的属性名时,可以保证不会出现同名的属性。对象属性名为字符串或者Symbol时,[code]Object.assign()[/code]都支持。 [b]2. 属性复制通过赋值实现[/b] target对象的属性是通过复制来创建的,这就意味着,如果target有setters方法时,它们将会被调用。 另一种方案是通过定义来实现,这样将会创建新的自有属性,不会调用setters方法。其实,另一个版本的[code]Object.assign()[/code]的提案正是采用这种方法。不过,这个提议在ES6中被拒绝了,也许之后的版本会再考虑。 [b]Object.assign()使用示例[/b] [b]1. 初始化对象属性[/b] 构造器正是为了初始化对象的属性,通常,我们不得不多次重复属性的名字。示例代码的constructor中,x与y均重复了两次:
class Point
{
 constructor(x, y)
 {
  this.x = x;
  this.y = y;
 }
}
如果可以的话,个人偏爱将所有冗余都省去。(事实上,CoffeeScript与TypeScript都有语法解决构造器中属性名重复的问题。):
class Point
{
 constructor(this.x, this.y){}
}
至少,[code]Object.assign()[/code]可以帮助我们减少一些重复:
class Point
{
 constructor(x, y)
 {
  Object.assign(this, { x, y });
 }
}
在ES6中, [code]{ x, y }[/code]为[code]{ x: x, y: y }[/code]的缩写。 [b]2. 为对象添加方法[/b] ECMAScript 5, you use a function expression to add a method to an object: 在ES5中,需要使用function关键字定义对象的新增方法:
MyClass.prototype.foo = function(arg1, arg2)
{
 //...
};
在ES6中,对象方法的定义更加简洁,不需要使用function关键字。这时,可以使用[code]Object.assign()[/code]为对象新增方法:
Object.assign(MyClass.prototype,
{
 foo(arg1, arg2)
 {
  //...
 }
});
[b]3. 复制对象[/b] 使用[code]Object.assign()[/code]深度复制对象,包括其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}
[b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。 [b]参考[/b] [list] [*][url=http://2ality.com/2012/10/javascript-properties.html]Object properties in JavaScript[/url][/*] [*][url=http://2ality.com/2012/08/property-definition-assignment.html]Properties in JavaScript: definition versus assignment[/url][/*] [*][url=http://2ality.com/2013/08/es6-callables.html]Callable entities in ECMAScript 6[/url][/*] [/list] 原文: [url=http://2ality.com/2014/01/object-assign.html]ECMAScript 6: merging objects via Object.assign()[/url] 译者: [url=https://fundebug.com/]Fundebug[/url]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部