本文主要和大家分享,object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ),下面这篇文章主要给大家介绍了关于es6中新增的object.assign()方法的相关资料,需要的朋友可以参考下,希望能帮助到大家。
前言
将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}
相关推荐:
7个es6的实用技巧分享
es6 javascript中class类的get与set用法实例
es6中类的静态方法有哪些作用
以上就是es6中object.assign()方法的详细内容。