官方:Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象
用法
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
源码
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) { //arguments为全部的对象集合
var source = arguments[i]; //单个对象
//遍历一个对象的自身和继承来的属性,
//常常配合hasOwnProperty筛选出对象自身的属性
for (var key in source) {
//使用call方法,避免原型对象扩展带来的干扰
if (Object.prototype.hasOwnProperty.call(source, key)) { ///判断是否为source自身的属性。 (非继承)说明Object.assign只能加源对象的自身的属性,不算继承的。
target[key] = source[key];
}
}
}
return target;
};
注:
// arguments是一个伪数组,除了length属性和索引元素之外没有任何Array属性
// 官方:Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身**(非继承)**属性。
var bbb = {
hasOwnProperty: function () {
return false;
},
bar: 'MABAOGUO'
};
// bbb.hasOwnProperty('bar'); // 始终返回 false
({}).hasOwnProperty.call(bbb, 'bar')// true
bbb.__proto__.hasOwnProperty.call(bbb, 'bar'); // true
Object.prototype.hasOwnProperty.call(bbb, 'bar');// true
原因:相当于借用别的对象的hasOwnProperty方法