首页 技术 正文
技术 2022年11月11日
0 收藏 402 点赞 3,962 浏览 2104 个字

1.对象类别

普通对象:具有JavaScript对象的所有默认内部行为

特异对象: 具有某些与默认行为不符的内部行为

标准对象: ECMAScript 6 规范中新定义的对象,例如Array,Date等,既可以是普通对象,也可以是特异对象

内建对象: 脚本开始执行时存在于JavaScript执行环境中的对象,所有标准对象都是内建对象

2.对象字面量语法扩展

(1)属性初始化的简写

ES6  对对象的扩展

上述函数返回了一个对象,有name和age属性,但是age和name分别写了两遍

ES6 中,使用属性初始化的简写语法,可以消除这种属性名称与局部变量之间的重复书写

当属性与本地变量同名时,可以简单地只写属性名

ES6  对对象的扩展

当对象字面量里只有一个属性的名称时,JavaScript引擎会在可访问作用域中查找同名变量;如果找到则赋值,有利于消除命名错误

(2)对象方法的简写语法

ES6  对对象的扩展

ES6 中,可以写成这样

ES6  对对象的扩展

(3)可计算属性名

ES5 中访问对象语法

ES6  对对象的扩展

只能在属性名已知的情况下为对象定义属性,如果属性名被包含在一个变量中,或者该属性需要被计算

ES5 是无法为一个对象字面量定义该属性的。

而在ES6 中,可在对象字面量中使用可计算属性名称,举例:

ES6  对对象的扩展

ES6  对对象的扩展

(4)新增方法

Object.is() 接收两个参数,用于比较,主要用于处理全等操作符中的特殊情况

在全等操作符(“===”)中,+0 和 -0 会被认为是相等的,NaN 和 NaN 会被认为是不相等的

所以引入了Object.is() 进行校正,例如:

ES6  对对象的扩展

Object.assign() 拷贝对象

接受一个接收对象和任意数量的源对象作为参数,如果多个源对象具有同名属性,则排位靠后的源对象会覆盖排位靠前的。

ES6  对对象的扩展

ES6  对对象的扩展

看上图可以发现Object.assign() 执行的是浅复制,当源对象中里面属性值仍为一个对象时,复制的是对象的一个引用,

对两者中任何一个修改,都会反映到另一个对象上。

访问器属性

Object.assign() 方法不能将提供者的访问器属性复制到接收对象中,由于Object.assign()执行了赋值操作,因此提供者的访问器属性最终会转变为接收对象中的一个数据属性

ES6  对对象的扩展只会为receiver对象增加一个name属性

重复的对象字面量属性

ES5 中,严格模式加入了对象字面量重复的校验。当有多个同名属性时会抛出错误

但是在ES6 严格模式中这种重复性校验被移除了,后一个同名属性会替代前一个同名属性的值。

自有属性枚举顺序

ES6  对对象的扩展

自有属性枚举规则:

(1)所有数字按升序排序

(2)所有字符串键按照它们加入对象顺序排序

(3)所有symbol键按照它们被加入对象的顺序排序

for-in循环,Object.keys(),JSON.stringify() 方法指明与for-in相同顺序,但不明晰

增强对象原型

(1)改变对象原型Object.setPrototypeOf()方法

接收两个参数,被改变原型的对象以及替代第一个参数原型的对象

ES6  对对象的扩展

简化原型访问的Super引用

ES6  对对象的扩展

通过取得原型调用getGreeting() 与 call绑定当前this  有些复杂,可以通过ES6 中super关键字来引用

ES6  对对象的扩展

Super引用相当于指向对象原型的指针,在该例中也就相当于Object.getPrototypeOf(this)的值,super执行环境在当前上下文中

但是必须要在使用简写方法的对象中使用Super引用

ES6  对对象的扩展

Super引用在多重继承的情况下非常有用,因为在这种情况下,Object.getPrototypeOf() 方法会有问题

ES6  对对象的扩展

上述代码首先将friend对象的原型设置为person对象,在friend中调用person对象的getGreeting()方法,当前上下文(this)为friend 对象,没有问题

接着,又创建了一个relative对象,其原型为friend对象,组成了一条原型链,在relative对象上调用getGreeting()方法,一层层找到其原型(friend对象上),

执行friend中的getGreeting方法,但是此时上下文为relative对象,Object.getPrototypeOf(relative) 为friend对象,即调用friend.getGreeting.call(relative)方法,

相当于又在relative上下文执行一次friend.getGreeting()方法,如何陷入了循环递归调用,最后会造成栈溢出报错

在ES6 中利用Super引用可以很好地解决这个问题

ES6  对对象的扩展

Super引用不是动态变化的,它总是指向正确的对象,在该实例中,无论有多少对象继承了getGreeting()方法,

super.getGreeting() 始终指向person.getGreeting() 方法

正式的方法定义

ES6 之前没有正式定义”方法”的概念,ES6中正式将方法定义为一个函数,它会有一个内部的[[HomeObject]]属性来容纳这个方法从属的对象

ES6  对对象的扩展

Super 所有引用都通过[[HomeObject]] 属性来确定后续运行过程。

第一步是在[[HomeObject]]属性上调用Object.getPrototypeOf()方法来检索原型的引用;然后搜索原型找到同名函数

最后,设置this绑定并且调用相应的方法

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,984
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,501
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,345
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,128
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,763
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,839