javascript 之 扩展对象 Object.assing
语法:Object.assign(target,...source)
说明:Object.assign方法的第一个参数是目标对象,后面的参数都是源对象
一、以对象为参数的合并
1、第一个参数都是对象,后面的参数都是源对象
1 2 3 4 5 | const target={a:1}; const source1={b:2}; const source2={c:2}; Object.assign(target,source1,source2); 输出:console.log(target); //{a:1,b:2,c:3} |
2、 若只有一参数,会直接返回该参数
1 2 | const obj={a:1}; consolt.log(Object. is (Object.asign(obj),obj));<br>输出:ture; |
3、如果该参数不是对象会先转成对象
1 2 3 4 | console.log(Object.assign(2)); 输出:Number对象,其值为 2 console.log( typeof Object.assign(2)); 输出: object |
4、undefined和null无法转成对象,会报错
1 2 | console.log(Object.assign(undefined)); //报错 console.log(Object.assign( null )); //报错 |
二、如果非对象参数出现在源对象的位置上
1、如果undefined和null不在首参数,就不会报错
1 2 3 4 5 | let obj1={a:1}; console.log(Object. is (Object.assign(obj1,undefined),obj1)); 输出: true console.log(Object. is (Object.assign(obj1, null ),obj1)); 输出: true |
2、其他类型的值不在首参数也不会报错。但是目标对象一般都是对象,所以源对象也应该是对象。
1 2 3 4 5 6 7 8 | const v1= 'abc' ; const v2= true ; const v3={ 'Symbol' :0}; const v4=10; const v5=5; const v6=7; const obj2=Object.assign({},v1,v2,v3,v4); console.log(obj2);<br>输出:{0: 'a' ,1: 'b' ,2: 'c' , 'Symbol' :0};<br> const obj3=Object.assign({},v4,v5,v6);<br>输出:{}<br> const obj3=Object.assgin(v4,v5,v6);<br>输出:Number对象,没有值 |
3、Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性,也不拷贝不可枚举的属性)
1 2 | Object.assign({b: 'c' },Object.defineProperty({}, 'invisible' ,{enumerable: false ,value: 'hello' })); 最后的结果没有验证: //{b:'c'} |
4、同名属性的替换(不管该属性的值是否为对象)
1 2 3 4 | const v1={a:{b:1}}; const v2=Object.assign({a:3,b:4},v1); console.log(v2.a.b); 输出结果:1 |
5、数组的处理,把数组视为对象(就像上面有一个案例 v1=‘abc’,变为 0:'a',1:'b',2:'c')
1 2 3 | var v5=Object.assign([1,2,3],[4,5]); console.log(v5); 输出:[4,5,3] |
6、取值函数的处理,若复制的值是取值函数,那么求值后再复制
1 2 3 4 | const v4={ get foo(){ return 1}}; const target={}; console.log(Object.assign(target,v4));<br>输出:{foo:1} console.log(target.foo);<br>输出:1 |
三、常见的用途
1、为对象添加属性
1 2 3 4 5 | class Point{ constructor(x,y){ Object.assign( this ,{x,y}); } } <br><br>扩展内容: class 声明创建一个基于原型继承的具有给定名称的新类 |
class Polygon {
constructor(height, width) {
this.area = height * width;
}
}
console.log(new Polygon(4,3).area);
// expected output: 12
2、为对象添加方法
1 | Object.assign(SomeClass.prototype,{someMethod(arg1,arg2){},anotherMethod(){}}); |
3、克隆对象
1 2 3 | function clone(obj){ return Object.assign({},obj); } |
4、合并多个对象
1 | const merge=(target,...sources)=>Object.assign(target,...sources); |
5、为属性指定默认值
1 2 3 4 5 6 7 8 9 10 | const DEFAULTS = { logLevel: 0, outputFormat: 'html' }; function processContent(options) { options = Object.assign({}, DEFAULTS, options); console.log(options); // ... } |
分类:
javascript框架设计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-08-09 ORM框架 之 Entity Framework