limsPerson: Object.assign({}, that.limsPerson) 赋值时,为什么里面的属性会漏掉?
-
对象属性的key值拼写错误;
-
对象属性的赋值为undefined或null;
-
属性位于原型链中而不是对象本身。Object.assign只会拷贝对象本身的可枚举属性,而不会拷贝原型链上的属性;
-
对象属性的值是一个不可枚举的数据属性。在JSON.stringify、Object.assign等语句中,只会复制一个对象的可枚举数据属性,而不会复制不可枚举的数据属性。
JavaScript 中的对象可以通过原型链(prototype chain)继承属性和方法。一个对象实例可以继承它的原型对象(prototype object)的属性和方法。当通过 Object.assign 去拷贝对象时,只会拷贝当前对象本身的可枚举属性(enumerable properties),而不会拷贝它的原型链上的属性和方法。
一般来说,对象的继承关系是通过 Object.create() 方法或类/构造函数来建立的。如果一个属性是通过对象的原型链继承而来,那么这个属性就不会被 Object.assign() 拷贝到新的对象中去。
假设存在两个对象 obj1 和 obj2,并且 obj1 继承自 obj2,那么使用 Object.assign() 拷贝 obj1 时,只会将 obj1 直接拥有的可枚举属性拷贝给新的对象,而不会将 obj2 中的属性拷贝过来。
const obj2 = { a: 1 };
const obj1 = Object.create(obj2); // obj2 是 obj1 的原型对象 obj1.b = 2;
const newObj = Object.assign({}, obj1);
console.log(newObj); // { b: 2 },由于 obj1 的继承关系,obj2.a 不会被拷贝过来
需要注意的是,在 ES6 中,类中定义的属性默认是不可枚举的,因此使用 Object.assign() 时,类实例的属性可能不会被拷贝过去。如果需要拷贝所有的属性,可以使用 Object.getOwnPropertyNames() 或 Reflect.ownKeys() 来获取所有的属性,然后再进行拷贝。