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数组使用调用方法汇总
Dec 08 Javascript
javascript 获取网页参数系统
Jul 19 Javascript
JavaScript聚焦于第一个字段的代码
Oct 15 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
JavaScript列表框listbox全选和反选的实现方法
Mar 18 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
Position属性之relative用法
Dec 14 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
Bootstrap缩略图与警告框学习使用
Feb 08 Javascript
浅谈vuepress 踩坑记
Apr 18 Javascript
Vue实现开关按钮拖拽效果
Sep 22 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
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
2014年综治宣传月活动总结
2014/04/28 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
民生工作实施方案
2014/05/31 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js