Object.assign()用法
时间: 2023-11-15 17:00:32 浏览: 95
Object.assign() 方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。该方法实现的是浅拷贝,而不是深拷贝。目标对象拷贝得到的是这个对象的引用。语法为:Object.assign(target, …sources)。其中,target为目标对象,sources为源对象。可以传入多个源对象,后面的源对象属性会覆盖前面的源对象属性。如果目标对象中已经存在相同的属性,则后面的属性会覆盖前面的属性。<<引用>>
举个例子,假设有两个对象aaa和bbb,aaa有两个属性text和value,bbb有一个属性text。我们可以使用Object.assign()方法将bbb的属性text复制到aaa中,生成一个新的对象ccc,代码如下:
let aaa = { text: 2, value: 11 }
let bbb = { text: 3 }
let ccc = Object.assign(aaa, bbb)
console.log(aaa) // 输出 { text: 3, value: 11 }
console.log(bbb) // 输出 { text: 3 }
console.log(ccc) // 输出 { text: 3, value: 11 }
相关问题
创建Person对象 使用Object.assign()给对象添加属性name、age; 使用Object.assign()给对象方法infor(),输出对象的name和age值; 使用Object.assign()给对象添加属性sex,并设置默认值为‘male’;
在JavaScript中,你可以使用`Object.assign()`方法来合并新的或已有对象的属性到目标对象上。首先,你需要创建一个基础的`Person`对象,然后逐个添加属性和方法。下面是步骤:
1. 创建一个空的`Person`构造函数:
```javascript
function Person() {
// 默认属性初始值
}
```
2. 使用`Object.assign()`添加属性`name`和`age`:
```javascript
let person = new Person();
Object.assign(person, { name: '', age: 0 });
```
这里我们假设`name`和`age`都是可为空字符串和整数。
3. 添加一个方法`info()`,这个方法通常会在构造函数内部定义,但也可以直接作为对象的方法:
```javascript
// 如果你想在构造函数内部:
Person.prototype.info = function() {
console.log(`Name: ${this.name}, Age: ${this.age}`);
};
// 或者直接作为对象的方法(如果不在构造函数内):
person.info = function() {
console.log(`Name: ${this.name}, Age: ${this.age}`);
};
```
4. 使用`Object.assign()`添加属性`sex`并设置默认值:
```javascript
Object.assign(person, { sex: 'male' });
```
完整代码示例:
```javascript
function Person() {
this.info = function() {
console.log(`Name: ${this.name}, Age: ${this.age}`);
};
}
let person = new Person();
Object.assign(person, { name: '', age: 0 });
Object.assign(person, { sex: 'male' });
person.name = 'John Doe'; // 设置name
person.age = 30; // 设置age
person.info(); // 输出信息
```
解释一下这个函数: static mapStruct(struct, mapper, prop) { if (!struct) { return mapper(struct, prop); } let newStruct = mapper(struct, prop); if (!newStruct) { return newStruct; } if (newStruct === null || newStruct === void 0 ? void 0 : newStruct.definitions) { newStruct = Object.assign(Object.assign({}, (newStruct || {})), { definitions: mapObject(newStruct === null || newStruct === void 0 ? void 0 : newStruct.definitions, (val, key) => { return StructOp.mapStruct(val, mapper, key); }) }); } switch (struct === null || struct === void 0 ? void 0 : struct.type) { case "array": { if (struct.items) { return Object.assign(Object.assign({}, newStruct), { items: StructOp.mapStruct(struct.items, mapper) }); } return newStruct; } case "object": { if (newStruct === null || newStruct === void 0 ? void 0 : newStruct.properties) { return Object.assign(Object.assign({}, newStruct), { properties: Object.keys(newStruct.properties || {}).reduce((newProps, prop) => { const propStruct = StructOp.mapStruct(newStruct.properties[prop], mapper, prop); if (propStruct) { return Object.assign(Object.assign({}, newProps), { [prop]: propStruct }); } else { return newProps; } }, {}) }); } if (struct.additionalProperties) { return Object.assign(Object.assign({}, newStruct), { additionalProperties: StructOp.mapStruct(struct.additionalProperties, mapper) }); } } case "boolean": case "integer": case "number": case "string": { return newStruct; } } return newStruct; }
这是一个静态方法,接受三个参数:struct、mapper和prop。它的作用是将一个结构体对象进行映射转换。具体来说,它会先使用mapper函数对结构体对象进行映射转换,得到一个新的结构体对象newStruct。然后根据原结构体对象的类型,对newStruct进行进一步的处理,最后返回处理后的newStruct。
具体来说,如果原结构体对象为null或undefined,直接返回mapper函数对其进行映射转换后的结果。否则,对newStruct进行进一步的处理:
1. 如果newStruct中包含了definitions属性,递归调用mapStruct方法对其进行映射转换,并将转换后的结果赋值给newStruct的definitions属性;
2. 如果原结构体对象的类型为array,且有items属性,则对items属性进行递归调用mapStruct方法进行映射转换,并将转换后的结果赋值给newStruct的items属性;
3. 如果原结构体对象的类型为object,且newStruct中包含了properties属性,则对properties属性进行遍历,递归调用mapStruct方法对每个属性进行映射转换,并将转换后的结果赋值给newProps对象的对应属性。最后将所有转换后的属性保存到newStruct的properties属性中;
4. 如果原结构体对象的类型为object,且有additionalProperties属性,则对additionalProperties属性进行递归调用mapStruct方法进行映射转换,并将转换后的结果赋值给newStruct的additionalProperties属性;
5. 如果原结构体对象的类型为boolean、integer、number或string,则直接返回newStruct。
最后,返回处理后的newStruct。
阅读全文