zoukankan      html  css  js  c++  java
  • javascript 之 扩展对象 Object.assing

    语法:Object.assign(target,...source)

    说明:Object.assign方法的第一个参数是目标对象,后面的参数都是源对象

    一、以对象为参数的合并

    1、第一个参数都是对象,后面的参数都是源对象

    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、 若只有一参数,会直接返回该参数

    const obj={a:1};
    consolt.log(Object.is(Object.asign(obj),obj));
    输出:ture;

    3、如果该参数不是对象会先转成对象

    console.log(Object.assign(2));
    输出:Number对象,其值为 2
    console.log(typeof Object.assign(2));
    输出:object
    

    4、undefined和null无法转成对象,会报错

    console.log(Object.assign(undefined));//报错
    console.log(Object.assign(null));//报错  

    二、如果非对象参数出现在源对象的位置上

    1、如果undefined和null不在首参数,就不会报错

    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、其他类型的值不在首参数也不会报错。但是目标对象一般都是对象,所以源对象也应该是对象。

    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);
    输出:{0:'a',1:'b',2:'c','Symbol':0};
    const obj3=Object.assign({},v4,v5,v6);
    输出:{}
    const obj3=Object.assgin(v4,v5,v6);
    输出:Number对象,没有值

    3、Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性,也不拷贝不可枚举的属性)

    Object.assign({b:'c'},Object.defineProperty({},'invisible',{enumerable:false,value:'hello'}));
    最后的结果没有验证://{b:'c'}
    

    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')

    var v5=Object.assign([1,2,3],[4,5]);
    console.log(v5);
    输出:[4,5,3]
    

    6、取值函数的处理,若复制的值是取值函数,那么求值后再复制

    const v4={get foo(){return 1}};
    const target={};
    console.log(Object.assign(target,v4));
    输出:{foo:1} console.log(target.foo);
    输出:1

    三、常见的用途

    1、为对象添加属性 

    class Point{
       constructor(x,y){
          Object.assign(this,{x,y});
       }      
    }  

    扩展内容:class声明创建一个基于原型继承的具有给定名称的新类

        class Polygon {
            constructor(height, width) {
                this.area = height * width;
            }
         }

         console.log(new Polygon(4,3).area);

         // expected output: 12

    2、为对象添加方法

    Object.assign(SomeClass.prototype,{someMethod(arg1,arg2){},anotherMethod(){}});
    

    3、克隆对象

    function clone(obj){
       return Object.assign({},obj);  
    }
    

    4、合并多个对象

     const merge=(target,...sources)=>Object.assign(target,...sources);
    

    5、为属性指定默认值

    const DEFAULTS = {
      logLevel: 0,
      outputFormat: 'html'
    };
    
    function processContent(options) {
      options = Object.assign({}, DEFAULTS, options);
      console.log(options);
      // ...
    }
    

      

      

      

      

      

      

     

      

      

      

      

      

  • 相关阅读:
    log4cpp
    互斥锁封装
    Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)
    Codeforces 920E-Connected Components? (set,补图,连通块)
    Persistent Bookcase CodeForces
    P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
    P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
    CDQ 分治解决和点对有关的问题
    洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
    洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
  • 原文地址:https://www.cnblogs.com/zmztya/p/11328333.html
Copyright © 2011-2022 走看看