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 TO HTML 转换
Jun 26 Javascript
jQuery 处理网页内容的实现代码
Feb 15 Javascript
Js动态添加复选框Checkbox的实例方法
Apr 08 Javascript
jquery退出each循环的写法
Feb 26 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
浅谈js中几种实用的跨域方法原理详解
Dec 02 Javascript
js 轮播效果实例分享
Dec 28 Javascript
删除table表格行的实例讲解
Sep 21 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
小程序如何获取多个formId实现详解
Sep 20 Javascript
使用JS实现简易计算器
Jun 14 Javascript
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
综合图片计数器
2006/10/09 PHP
Php Cookie的一个使用注意点
2008/11/08 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
php获取域名的google收录示例
2014/03/24 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
基于hashlib模块--加密(详解)
2017/06/21 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
python多进程读图提取特征存npy
2019/05/21 Python
django迁移数据库错误问题解决
2019/07/29 Python
Python hmac模块使用实例解析
2019/12/24 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
python利用线程实现多任务
2020/09/18 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
公司年会晚宴演讲稿
2014/01/06 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
高中教师评语大全
2014/04/25 职场文书
环保倡议书300字
2014/05/15 职场文书
阅兵口号
2014/06/19 职场文书
白银帝国观后感
2015/06/17 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL