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

  

  

  

  

  

  

 

  

  

  

  

  

javascript 之 扩展对象 Object.assing的更多相关文章

  1. JavaScript内置对象-Object

    ▓▓▓▓▓▓ 大致介绍 JavaScript的简单数据类型包括:Undefined.Null.Boolean.Number.String.JavaScript中这五种基本数据类型不是对象,其他所有值都 ...

  2. javascript 之 扩展对象 jQuery.extend

    在JQuery的API手册中,extend方法挂载在JQuery 和 JQuery.fn两个不同的对象上,但在JQuery内部代码实现的是相同的,只是功能各不相同. 官方解释: jQuery.exte ...

  3. javascript 之 扩展对象

    注意点:在js中常见的几种方进行扩展 第一种:ES6提供的 Object.assign(); 第二种:ES5提供的 extend()方法 第三种:Object对象提供的 defineProperty( ...

  4. 对Javascript中的对象Object改变内存及其变量改变的图解

    Object 存储变量时,变量属性的内存改变图解 左边: 对象的内存   中间:变量属性的内存   右边:属性值的内存 [图一]创建一个对象,存obj1 变量--里面存age 属性和属性值--12. ...

  5. javascript 内置对象及常见API

    javascript 内置对象及常见API 2012-09-02 15:17 571人阅读 评论(0) 收藏 举报 javascript正则表达式文档浏览器urlstring Javascript内置 ...

  6. JS对象-不可扩展对象、密封对象、冻结对象

    不可扩展对象 Object.preventExtensions() 仅阻止添加自身的属性.但属性仍然可以添加到对象原型. 可以用 Object.isExtensible(obj) 来判断对象是否可扩展 ...

  7. 深入JavaScript对象(Object)与类(class),详细了解类、原型

    JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象 ...

  8. 设计模式之美:Extension Object(扩展对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...

  9. javascript EcmaScript5 新增对象之Object.freeze

    我们都知道在js里对象是很容易改变的 var obj1 ={ a:'111' } obj1.a = '222'; console.log( obj.a ) //output 222 对象的属性发生了变 ...

随机推荐

  1. hive分区表新增字段,已有分区显示为null

    如果在hive的分区表新增非分区字段,那么原有的分区的数据即使重新运行也会显示为null. 必须先删除该分区,再重新跑数据.

  2. 【转载】 clusterdata-2011-2 谷歌集群数据分析(三)

    原文地址: https://blog.csdn.net/yangss123/article/details/78306270 由于原文声明其原创文章不得允许不可转载,故这里没有转载其正文内容. --- ...

  3. linux部署php网页

    liunx环境下运行php和传统的Java web程序不一样.我直接放在tomcat下竟然不行. 安装了php的一些环境,还是访问不了,原因是不支持https访问.没办法,还是得用tomcat,同时我 ...

  4. Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)

    第一次请求失败了 打印出了403,第二次更新成功 现在只处理了403这种情况,还有一种情况就是401,就是当前用户需要做身份认证,你没有做身份认证. 401的处理 与403类似,也是在这里配置.Ent ...

  5. Spring cloud微服务安全实战-_5-10实现基于session的SSO(Token有效期)

    refresh_token过期了怎么办,虽然可以设置一个比较长的有效期,但是终归还是要过期的. 只能从认证服务器重新走认证授权的流程. 两种情况 1,session还没过期的,跳过去之后,直接就知道你 ...

  6. Sqoop2 将hdfs中的数据导出到MySQL

    1.进入sqoop2终端: [root@master /]# sqoop2 2.为客户端配置服务器: sqoop:000> set server --host master --port 120 ...

  7. DNS解析问题

    DNS解析问题,在/etc/resolv.conf文件中加如下一行: nameserver 8.8.8.8 即使用谷歌的域名服务器 如下问题都是DNS解析问题: apt-get update 异常 T ...

  8. elasticsearch in语句和not in语句

    sql语句示例: select * from table where t_id in (1,2,3,4) php代码示例: $search_query = [ "bool" =&g ...

  9. vue-cli3项目中全局引入less sass文件 以及使用本地图片在不同地方规则

    第一种直接在main.js中引入,需要声明loader demo: import '!style-loader!css-loader!less-loader!./assets/css/common.l ...

  10. Python机器学习基础教程

    介绍 本系列教程基本就是搬运<Python机器学习基础教程>里面的实例. Github仓库 使用 jupyternote book 是一个很好的快速构建代码的选择,本系列教程都能在我的Gi ...