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 相关文章推荐
使用js获取QueryString的方法小结
Feb 28 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
Sep 01 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
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 工厂模式使用方法
2010/05/18 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
详解Python发送邮件实例
2016/01/10 Python
python编程嵌套函数实例代码
2018/02/11 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
鱼油专家:Omegavia
2016/10/10 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
《胡杨》教学反思
2014/02/16 职场文书
初三学习决心书
2014/03/11 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
收银员岗位职责范本
2015/04/07 职场文书
党员转正党支部意见
2015/06/02 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android