其他章节请看:

es6 快速入门 系列

对象

试图解决的问题

写法繁杂

属性初始值需要重复写

function createPeople(name, age){
// name 和 age 都写了 2 次
return {
name: name,
age: age
}
}

对象中的方法有更简单的写法吗?

let person = {
name: 'aaron',
sayName: function(){ }
}

原型访问困难

要记得如何使用 Object.getPrototypeOf() 方法和 .call(this) 方法来调用原型上的方法实在有些复杂

let people = {
role: 'father',
say: function(){
console.log(`你好: ${this.role}`)
}
} let friend = {
role: 'son',
say(){
// 调用原型上的方法
Object.getPrototypeOf(this).say.call(this)
}
}
// 将friend的原型指定为people
Object.setPrototypeOf(friend, people)
friend.say() // 你好: son

解决方法

写法繁杂

es6给对象提供了属性初始值对象方法的简写语法

重写上面(试图解决的问题->写法繁杂)的例子:

function createPeople(name, age){
// name 和 age 没有重复了
return {
name,
age
}
}
let person = {
name: 'aaron',
// 去掉了冒号和function
sayName(){ }
}

原型访问困难

es6引入 super 来访问原型用于简化原型的访问

super 是指向对象原型的指针,调用 super 相当于调用 Object.getPrototypeof(this)

用 super 重写上面(试图解决的问题->原型访问困难)的例子:

let people = {
role: 'father',
say: function(){
console.log(`你好: ${this.role}`)
}
} let friend = {
role: 'son',
say(){
// 这段代码与 Object.getPrototypeOf(this).say.call(this) 相同
super.say()
}
}
// 将friend的原型指定为people
Object.setPrototypeOf(friend, people)
friend.say() // 你好: son

:必须在简写方法的对象中使用 super

let people = {
say: function(){
console.log('你好')
}
} let friend = {
// 简写方法
say(){
super.say()
}
} Object.setPrototypeOf(friend, people)
friend.say() // 你好

如果在非简写方法的对象中使用则会导致语法错误,就像这样:

let friend = {
// 非简写。语法错误
say: function(){
super.say()
}
}

补充

可计算属性名

可以在对象字面量中使用可计算属性名,语法是使用方括号([])。请看示例:

let fullName = 'full name';

let obj = {
// 使用 [] 定义可计算属性名
[fullName]: 'aaron',
['test ' + fullName]: 'testAaron'
}
console.log(obj[fullName]) // aaron
console.log(obj['test full name']) // testAaron

重复属性

es6 中无论是严格模式还是非严格模式,都不再检查重复属性,对于每组重复属性,都会选取最后一个取值。请看示例:

let obj = {
name: 'name1',
name: 'name2'
}
console.log(obj.name) // name2

新增方法

Object.is()

Object.is() 用于比较两个值

:大部分情况与 === 运算符相同,除了下面两种情况:

console.log(+0 === -0) // true
console.log(Object.is(+0, -0)) // false
console.log(NaN === NaN) // false
console.log(Object.is(NaN, NaN)) // true
Object.assign()

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象,返回目标对象。请看示例:

let target = {}
Object.assign(target, {name: 'aaron', age: 18}, {age:19})
// { name: 'aaron', age: 19 }
console.log(target)

:后者会覆盖前者,而且也不是深拷贝

Object.assign() 不能赋值访问器属性。请看示例:

// 由于Object.assign()执行的是赋值操作,因此提供者的访问器属性最终会转为接受对象的一个数据属性
let obj1 = {}
let obj2 = {
get name(){
return 'aaron'
}
}
// 类似 obj1.name = obj2.name
Object.assign(obj1, obj2)
let desc1 = Object.getOwnPropertyDescriptor(obj1, 'name')
let desc2 = Object.getOwnPropertyDescriptor(obj2, 'name')
console.log(desc1.value) // aaron
console.log(desc2.value) // undefined - value 只在数据属性描述符中

自有属性枚举顺序

es6 中严格规定了对象自有属性被枚举时的返回顺序:

  1. 所有数字键按照升序排列
  2. 字符串按照它们被加入对象的顺序排列
  3. Symbol键(后续会讲解)也按照它们被加入对象的顺序排列
let obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1.1:1, // 非数字键
1.0: 1 // 数字键
}
obj.d = 1
const result = []
for(let key in obj){
result.push(key)
}
console.log(result.join('')) // 012acb1.1d

上面例子,虽然数字在字面量中的顺序时随意的,但在枚举时会被重新排列。

:对于 for-in 循环,并非所有厂商都遵循相同的实现方式,因此仍未指定一个明确的枚举顺序。而 Object.keys() 和 JSON.stringify()都指明与 for-in 使用相同的枚举顺序,因此它们的枚举顺序目前也不明晰

改变对象的原型

es6 新增了 Object.setPrototypeOf() 方法来改变对象的原型。请看示例:

let people = {
say: function(){
console.log('你好')
}
}
let dog = {
say: function(){
console.log('汪汪')
}
} let friend = Object.create(people)
friend.say() // 你好
Object.setPrototypeOf(friend, dog)
friend.say() // 汪汪

:mdn 中提到,如果你关心性能,避免使用此方法。vue 2.x 对数组的变化侦测,就使用了此方法。

其他章节请看:

es6 快速入门 系列

es6 快速入门 系列 —— 对象的更多相关文章

  1. es6 快速入门 系列 —— promise

    其他章节请看: es6 快速入门 系列 Promise Promise 是一种异步编程的选择 初步认识Promise 用 Promise 来实现这样一个功能:发送一个 ajax,返回后输出 json ...

  2. es6快速入门 系列 - async

    其他章节请看: es6 快速入门 系列 async 前文我们已经知道 promise 是一种异步编程的选择.而 async 是一种用于执行异步任务更简单的语法. Tip:建议学完 Promise 在看 ...

  3. es6 快速入门 系列 —— 类 (class)

    其他章节请看: es6 快速入门 系列 类 类(class)是 javascript 新特性的一个重要组成部分,这一特性提供了一种更简洁的语法和更好的功能,可以让你通过一个安全.一致的方式来自定义对象 ...

  4. es6 快速入门 系列 —— 变量声明:let和const

    其他章节请看: es6 快速入门 系列 变量声明:let和const 试图解决的问题 经典的 var 声明让人迷惑 function demo1(v){ if(v){ var color='red' ...

  5. es6 快速入门 系列

    es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...

  6. es6 快速入门 —— 函数

    其他章节请看: es6 快速入门 系列 函数 函数是所有编程语言的重要组成部分,es6之前函数语法一直没什么变化,遗留了许多问题,javaScript开发者多年来不断抱怨,es6终于决定大力度更新函数 ...

  7. python 全栈开发,Day88(csrf_exempt,ES6 快速入门,Vue)

    BBS项目内容回顾 1. 登陆页面 1. 验证码 1. PIL(Pillow) 2. io 2. ORM 1. 增删改查 3. AJAX $.ajax({ url: '', type: '', dat ...

  8. vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...

  9. vue 快速入门 系列 —— 实例方法(或 property)和静态方法

    其他章节请看: vue 快速入门 系列 实例方法(或 property)和静态方法 在 Vue(自身) 项目结构 一文中,我们研究了 vue 项目自身构建过程,也知晓了 import Vue from ...

随机推荐

  1. 生成静态库.a文件和动态库.so文件

    转载来源:https://www.cnblogs.com/hookjc/ 静态库 在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项: d -----从指定的静态库文件中删除文件 m ...

  2. 对战平台虚拟War3局域网的原理对战平台虚拟War3局域网的原理

    转载请注明来源:https://www.cnblogs.com/hookjc/ 以War3为例,启动魔兽后,首先是如何看见主机的问题:魔兽是通过TCP/UDP协议进行数据发送的,那如何实现看到对方?我 ...

  3. 从服务间的一次调用分析整个springcloud的调用过程(一)

    首先我们知道springcloud是一个微服务框架,按照官方文档的说法,springcloud提供了一些开箱即用的功能: 1 分布式/版本化配置 2 服务的注册与发现 3 路由 4 服务到服务之间调用 ...

  4. suse 12 二进制部署 Kubernetets 1.19.7 - 第06章 - 部署kube-apiserver组件

    文章目录 1.6.部署kube-apiserver 1.6.0.创建kubernetes证书和私钥 1.6.1.生成kubernetes证书和私钥 1.6.2.创建metrics-server证书和私 ...

  5. 手把手带你安装最小化suse 12 linux

    当然. 你需要现有一个vmware,还要有一个suse的镜像,suse镜像可以直接去官网获取,只需要注册一个suse的账号就可以了,官网下载会有点慢,可以使用迅雷下载 F2 可以设置安装界面的语言,可 ...

  6. 《SelfClass》——Docker

    <SelfClass>--Docker 根据我的个人计划,我需要先了解一下Docker,并且能够使用起来. 目的:在我Mac上搭建一个Docker,在Docker上搭建一个MySQL数据库 ...

  7. Python:更改pip镜像源的方法

    windows系统一步更换 在命令提示符中运行 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 具体其它 ...

  8. 基于node的tcp客户端和服务端的简单通信

    1.简单介绍下TCP/IP TCP/IP是互联网相关协议的集合,分为以下四层:应用层.传输层.网络层.数据链路层. 分成四层的好处是,假如只有一层,某个地方需要改变设计时,就必须把所有整体替换掉,而分 ...

  9. windows清理用户痕迹

    1.日志管理器的基本使用 在这里创建自定义视图是非常重要的 在设置自定义视图不必设置的事件日志选项太多,可以按日志也可以按源进行设置,根据自己的情况来做决定 在cmd下可以使用wevtutil cl ...

  10. Renix签名字段详解——网络测试仪实操

    一.签名字段简介 在添加/修改流量时,会有一个签名字段选项 (1)勾选以后,RENIX软件在发流时,会把每个报文的Payload(净荷)的最后18字节修改为特殊的值,用来统计流的时延.丢包等内容 (2 ...