Object.assign
静态方法将一个或者多个源对象中所有可枚举的自有属性复制到目标对象,并返回修改后的目标对象。
Object.assign(target, ...sources)
target: 目标对象
sources:多个源对象
作用
- 只会拷贝源对象可枚举的 自有属性(字符串和 Symbol 类型属性) 都会被复制到目标对象
- 目标对象中的属性将被源对象中的属性覆盖,后面的源对象的属性将类似地覆盖前面的源对象的同名属性。
手写一个Object.assgin
function _assign(...args){
/**
写之前,先写一下需求
1..判断参数是否正确
2.合并
*/
}
好了,我这里看了一下 Object.assign 的 polyfill 的需求
1、判断原生Object是否支持该函数,如果不存在的话创建一个函数assign,并使用Object.defineProperty将该函数绑定到Object上。 2、判断参数是否正确(目标对象不能为空,我们可以直接设置{}传递进去,但必须设置值)。 3、使用Object()转成对象,并保存为to,最后返回这个对象to。 4、使用for...in循环遍历出所有可枚举的自有属性。并复制给新的目标对象(hasOwnProperty返回非原型链上的属性)。
说实话,很难受,感觉考虑的东西太多了。
/*
1、判断原生Object是否支持该函数,如果不存在的话创建一个函数assign,并使用Object.defineProperty将该函数绑定到Object上。
2、判断参数是否正确(目标对象不能为空,我们可以直接设置{}传递进去,但必须设置值)。
3、使用Object()转成对象,并保存为to,最后返回这个对象to。
4、使用for...in循环遍历出所有可枚举的自有属性。并复制给新的目标对象(hasOwnProperty返回非原型链上的属性)。
转换自己的语言
1.判断方法是否存在
2.判断类型
3.Object(target)
4.遍历自身可枚举的所有对象,复制
*/
if (typeof Object.assign !== 'function') {
Object.assign = function (...args) {
const target = args.shift();
if (target == null) throw new TypeError('错误类型')
const to = Object(target);
args.forEach(arg => {
// for .. in 会遍历到原型链
const AllKeys = Object.getOwnPropertyNames(arg).concat(Object.getOwnPropertySymbosl(arg));
for(let key in AllKeys) {
to[key] = arg[key];
}
})
return to;
}
}