第十章:Object.assign的用法

object.assign方法的用处

为对象添加属性

1
2
3
4
5
class Point{
consturctor(x,y){
object.assign(this,{x,y})
}
}

这个方法通过assign方法将x属性和y属性天爱到了Point类的对象实例。

为对象添加方法

1
2
3
4
5
6
7
8
Object.assign(SomeClass.prototype,{
someMethod(){
...
},
anotherMethod(){
...
}
});

等同于:

1
2
3
4
5
6
someClass.prototype.someMethod = function(arg1,arg2){
...
};
someClass.prototype.antherMethod = function(){
...
};

上面的代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign方法添加到someClass.prototype中。

克隆对象

1
2
3
function clone(origin){
return Object.assign({}, origin)
}

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

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

合并多个对象

将多个对象合并到某个对象

1
2
const merge =
(target,...sourcrs) => Object.assign(target,...suorces)

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

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

为属性指定默认值

1
2
3
4
5
6
7
8
const DEFAULTS = {
logLevel:0,
outputFormat: 'html'
};
function processContent(options){
let options = Object.assign({},DEFAULTS,options)
}

上面的代码制定DEFAULTS是一个默认的对象,options对像是用户提供的参数,Object.assign方法将DEFAULTS和options合并成一个新对象,如果两者有同名属性,那么option的属性就会覆盖掉DEFAUTLTS的属性值

值得注意的是,由于存在深拷贝的问题,DEFAULTS对象和options对象所有的属性的值只能是简单类型,而不是指向另一个对象,佛泽,将导致DEFAULTS对象的该属性不起作用。