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

ES6提供了Object.assign()方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target )。

Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象。

注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

1.基本语法如下:

var target = { a: 1 };
var source1 = { b: 2 };
var source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

2.assign的设计目的是用于合并接口的,所以它接收的第一个参数(目标)应该是对象,如果不是对象的话,它会在内部转换成对象,所以如果碰到了null或者undefined这种不能转换成对象的值的话,assign就会报错。但是如果源对象的参数位置,接收到了无法转换为对象的参数的话,会忽略这个源对象参数。

Object.assign(undefined) //  报错
Object.assign(null) //  报错

3.字符串会以数组形式,拷贝入目标对象

var v1 = 'abc';
var v2 = true;
var v3 = 10;
var obj = Object.assign({}, v1, v2, v3);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

4.Object.assign进行的拷贝是浅拷贝,并且Object.assign拷贝的属性是有限制的,只会拷贝对象本身的属性(不会拷贝继承属性),也不会拷贝不可枚举的属性。但是属性名为Symbol值的属性,是可以被Object.assign拷贝的。
如果assign只接收到了一个对象作为参数的话,就是说没有源对象要合并到目标对象上,那会原样把目标对象返回。

5.Object.assign把数组视为对象。

Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]

6. 常见用途

( 1 )为对象添加属性

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

上面的方法可以为对象Point类的实例对象添加属性x和属性y。

( 2 )为对象添加方法

将方法添加到类的原型对象上后,类的实例能继承这两个方法。

// 方法也是对象
// 将两个方法添加到类的原型对象上
// 类的实例会有这两个方法
Object.assign(SomeClass.prototype,{
    someMethod(arg1,arg2){...},
    anotherMethod(){...}
});

( 3 )克隆对象

function clone(origin) {
	return Object.assign({}, origin);
}

上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。

function clone(origin) {
	let originProto = Object.getPrototypeOf(origin);
	return Object.assign(Object.create(originProto), origin);
}

( 4 )合并多个对象

const merge =(target, ...sources) => Object.assign(target, ...sources);

如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。

const merge =(...sources) => Object.assign({}, ...sources);

( 5 )为属性指定默认值


const DEFAULTS = {
	logLevel: 0,
	outputFormat: 'html'
};
function processContent(options) {
	let options = Object.assign({}, DEFAULTS, options);
}

猜你喜欢

转载自blog.csdn.net/qq_42164670/article/details/83031452