ES6 Object.assign()的用法及其使用


Posted in Javascript onJanuary 18, 2020

1.Object.assign()基本用法:

Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。

let targetObj1 = { a: 1 };
    let sourceObj1 = { b: 1 };
    let sourceObj11 = { c: 3 };
    Object.assign(targetObj1, sourceObj1, sourceObj11);
    console.log(targetObj1);

注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

let targetObj1 = { a: 1, b: 2 };
    let sourceObj1 = { b: 1 };
    let sourceObj11 = { c: 3 };
    Object.assign(targetObj1, sourceObj1, sourceObj11);
    console.log(targetObj1);

如果只有一个参数,Object.assign会直接返回该参数。

let targetObj1 = { a: 4 }
    Object.assign(targetObj1);
    console.log(targetObj1)

如果该参数不是对象,则会先转成对象,然后返回。

console.log(typeof (Object.assign(2)));

由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。

console.log(typeof(Object.assign(null)));
 
 console.log(typeof(Object.assign(underfind)));

注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。

Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。

let obj1 = Object.assign({ dwb: 'zjl' },
 
Object.defineProperty({}, 'zmf', {
 
enumerable: false,
 
value: 'zmf'
 
})
 
)
 
console.log(obj1);
 
let obj2 = Object.assign({ dwb: 'zjl' },
 
Object.defineProperty({}, 'zmf', {
 
enumerable: true,
 
value: 'zmf'
 
})
 
)
 
console.log(obj2);

对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。

var target = { a: { b: 'c', d: 'e' } }
 
var source = { a: { b: 'hello' } }
 
Object.assign(target, source);

上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。

注意,Object.assign可以用来处理数组,但是会把数组视为对象。

console.log(Object.assign([1, 2, 3], [4, 5]));

其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。

Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

var object1 = { a: { b: 1 } };
 
var object2 = Object.assign({}, object1);
 
object1.a.b = 2;
 
console.log(object2.a.b);

2.用途

2.1为对象添加属性

2.2为对象添加方法

2.3克隆对象

function copyFnc(origin) {
 
return Object.assign({}, origin)
 
}
 
var sur = { a: 1, b: 2 };
 
console.log(copyFnc(sur));

上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。

不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。

function clone(origin) {
 
let originProto = Object.getPrototypeOf(origin);
 
return Object.assign(Object.create(originProto), origin);
 
}

 在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。

2.4 合并多个对象

//多个对象合并到某个对象

const merge = (target, ...sources) => Object.assign(target, ...sources);
//多个对象合并到新对象

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

2.5为属性指定默认值

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript学习笔记记录我的旅程
May 23 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
javascript中的window.location.search方法简介
Sep 02 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
完美实现js选项卡切换效果(一)
Mar 08 Javascript
详解Js中的模块化是如何实现的
Oct 18 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
vue项目中监听手机物理返回键的实现
Jan 18 #Javascript
vue组件内部引入外部js文件的方法
Jan 18 #Javascript
Node.js实现批量下载图片简单操作示例
Jan 18 #Javascript
vue实现微信浏览器左上角返回按钮拦截功能
Jan 18 #Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 #Javascript
JS数组方法slice()用法实例分析
Jan 18 #Javascript
JS实现横向轮播图(中级版)
Jan 18 #Javascript
You might like
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
Python爬取附近餐馆信息代码示例
2017/12/09 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
浅谈python常用程序算法
2019/03/22 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
python科学计算之narray对象用法
2019/11/25 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
存储过程和函数的区别
2013/05/28 面试题
int和Integer有什么区别
2013/05/25 面试题
国际金融专业自荐信
2014/07/05 职场文书
讲党性心得体会
2014/09/03 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
心理学培训心得体会
2016/01/22 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL