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);
  // ...
}

  

  

  

  

  

  

 

  

  

  

  

  

 

posted @   zmztyas  阅读(1180)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-08-09 ORM框架 之 Entity Framework
点击右上角即可分享
微信分享提示