Object.assign() 是一个 JavaScript 的静态方法,用于将一个或多个源对象的所有可枚举的自有属性复制到目标对象。它会返回修改后的目标对象。如果有相同的属性名,后面的源对象的属性会覆盖前面的。这个方法有一些特点和注意事项,本文将介绍以下几点:
1.只会拷贝本身的,不会拷贝prototype上的属性Object.assign()只会复制源对象自身的属性,不会复制它继承自原型链的属性。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log("Hello, I'm ${this.name}.");
};
let p1 = new Person('Alice', 20);
let p2 = Object.assign({}, p1);
console.log(p2); // {name: "Alice", age: 20}
console.log(p2.sayHello); // undefined
可以看到,p2对象没有复制p1对象的sayHello方法,因为这个方法是定义在Person.prototype上的,不属于p1对象自身的属性。
2.如果有同名的属性,后面的会覆盖前面的Object.assign()会按照源对象的顺序依次复制属性到目标对象,如果有同名的属性,后面的会覆盖前面的。
let obj1 = {a: 1, b: 2};
let obj2 = {b: 3, c: 4};
let obj3 = Object.assign({},obj1,obj2);
console.log(obj3); // {a: 1, b: 3, c: 4}
可以看到,obj3对象的b属性是由obj2对象覆盖了obj1对象的值。
3.如果target是undefined,null,无法转化为包装类,那么报错Object.assign()方法要求第一个参数必须是一个对象或者可以转化为一个对象的值。如果第一个参数是undefined或null,那么它无法转化为包装类(Object),所以会抛出TypeError异常。如果想要避免这种情况,可以使用默认参数或者逻辑运算符来提供一个空对象作为目标对象。
// 使用默认参数
function assign(target = {}, ...sources) {
return Object.assign(target, ...sources);
}
// 使用逻辑运算符
let target = null;
let source = {name: 'Tom'};
Object.assign(target || {}, source); // {name: "Tom"}
4.如果target是undefined,null,无法转化为包装类,那么报错Object.assign()要求目标对象必须是一个可转化为对象的值,否则会报错。如果传入undefined或者null作为目标对象,那么它们无法转化为包装类,所以会抛出TypeError异常。
let target = undefined;
let source = {a: 1};
let result = Object.assign(target, source); // TypeError: Cannot convert undefined or null to object
5.如果source不是对象,只有是string,可以计算,否则没有影响。Object.assign()方法只会复制源对象的自身属性,不会复制继承属性或不可枚举属性。如果源对象不是一个对象,而是一个原始值(比如数字,布尔值,null,undefined),那么它会被忽略,不会对目标对象产生任何影响。但是,如果源对象是一个字符串,那么它会被转化为一个类似于数组的对象,每个字符都是一个属性,然后复制到目标对象。
let target = {};
let source = 'hello';
Object.assign(target, source); // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
6.Object.assign的拷贝是浅拷贝,不是深拷贝Object.assign()方法只会复制源对象的属性值,而不会复制属性的引用。这意味着如果源对象的属性值是一个对象或数组,那么目标对象和源对象会共享同一个引用,修改其中一个会影响另一个。这就是浅拷贝的特点。如果想要实现深拷贝,就需要使用其他的方法,比如JSON.parse(JSON.stringify())或者递归遍历。
let target = {};
let source = {name: 'Tom', age: 20, hobbies: ['reading', 'writing']};
Object.assign(target, source); // {name: "Tom", age: 20, hobbies: ["reading", "writing"]}
target.name = 'Jerry';
target.hobbies.push('coding');
console.log(target); // {name: "Jerry", age: 20, hobbies: ["reading", "writing", "coding"]}
console.log(source); // {name: "Tom", age: 20, hobbies: ["reading", "writing", "coding"]}
以上就是Object.assign()方法的一些注意事项,希望对你有所帮助。