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中面向对象技术的模拟
Sep 25 Javascript
获取焦点时,利用js定时器设定时间执行动作
Apr 02 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
Mar 18 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
Apr 19 Javascript
JS实现网页时钟特效
Mar 25 Javascript
基于JavaScript实现表格隔行换色
May 08 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
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
Python中用于返回绝对值的abs()方法
2015/05/14 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python实现取余操作的简单实例
2020/08/16 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
《跨越百年的美丽》教学反思
2014/02/11 职场文书
八一建军节感言
2014/02/28 职场文书
婚庆司仪主持词
2014/03/15 职场文书
爱之链教学反思
2014/04/30 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
保安2014年终工作总结
2014/12/06 职场文书
2016年教师新年寄语
2015/08/18 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers