变量功能被加强了、函数功能被加强了,那么作为JavaScript中最普遍的对象,不加强对得起观众吗?

对象类别

在ES6中,对象分为下面几种叫法。(不需要知道概念)

1、普通对象

2、特异对象

3、标准对象

4、内建对象

对象字面量语法拓展

随便打开一个js文件,对象都无处不在,看一个简单的对象。

{
a: 2
}

ES6针对对象的语法扩展了一下功能

1、属性初始值简写

//ES5
function a(id) {
return {
id: id
};
}; //ES6
const a = (id) => ({
id
})

2、对象方法简写

// ES5
const obj = {
id: 1,
printId: function() {
console.log(this.id)
}
} // ES6
const obj = {
id: 1,
printId() {
console.log(this.id)
}
}

3、属性名可计算

属性名可以传入变量或者常量,而不只是一个固定的字符串。

const id = 5
const obj = {
[`my-${id}`]: id
}
console.log(obj['my-5']) // 5

ES6对象新增方法

在Object原始对象上新增方法,原则上来说不可取,但是为了解决全世界各地提交的issue,在ES6中的全局Object对象上新增了一些方法。

1、Object.is()

用来解决JavaScript中特殊类型 == 或者 === 异常的情况。

下面是一些异常情况

//实际出现了异常(错误输出)
console.log(NaN === NaN) // false
console.log(+0 === -0) // true
console.log(5 == "5") //true //我们期望的目标输出(正确输出)
console.log(NaN === NaN) // true
console.log(+0 === -0) // false
console.log(5 == "5") //false

为了解决历遗留问题,新增了Object.is()来处理2个值的比较。

console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(+0, -0)) // false
console.log(Object.is(5, "5")) //false

2、Object.assign()

也许你已经见过或者使用过这个方法了,那这个新增的方法解决了什么问题呢?

答:混合(Mixin)。

mixin是一个方法,实现了拷贝一个对象给另外一个对象,返回一个新的对象。

下面是一个mixin方法的实现,这个方法实现的是浅拷贝。将b对象的属性拷贝到了a对象,合并成一个新的对象。

//mixin不只有这一种实现方法。
function mixin(receiver, supplier) {
Object.keys(supplier).forEach((key) => {
receiver[key] = supplier[key]
})
return receiver
} let a = {name: 'sb'};
let b = {
c: {
d: 5
}
}
console.log(mixin(a, b)) // {"name":"sb","c":{"d":5}}

写这样一个mixin方法是不是很烦,而且每个项目都得引入这个方法,现在,ES6给我们提供了一个现成的方法Object.assign()来做mixin的事情。

假设要实现上面的mixin方法,你只需要给Object.assign()传入参数即可。

console.log(Object.assign(a, b))// {"name":"sb","c":{"d":5}}

使用Object.assign(),你就可以不是有继承就能获得另一个对象的所有属性,快捷好用。

看一个实现Component的例子。

//声明一个构造函数Component
class Component {}
//给构造函数设置原型方法
Component.prototype = {
componentWillMount() {},
componentDidMount() {},
render() {console.log('render')}
}
//定义一个新的对象
let MyComponent = {}
//新对象继承了Component的所有方法和属性。
Object.assign(MyComponent, Component.prototype) console.log(MyComponent.render()) // render

在react的reducer中,每次传入新的参数返回新的state,你都可能用到Object.assign()方法。

重复的对象字面量属性

ES5的严格模式下,如果你的对象中出现了key相同的情况,那么就会抛出错误。而在ES6的严格模式下,不会报错,后面的key会覆盖掉前面相同的key。

const state = {
id: 1,
id: 2
}
console.log(state.id) // 2

自有属性枚举顺序

这个概念看起来比较模糊,如果你看了下面的例子,你可能就会明白在说什么了。

const state = {
id: 1,
5: 5,
name: "eryue",
3: 3
} Object.getOwnPropertyNames(state)
//["3","5","id","name"] 枚举key Object.assign(state, null)
//{"3":3,"5":5,"id":1,"name":"eryue"}

上面的例子的输出结果都有个规律,就是数字提前,按顺序排序,接着是字母排序。而这种行为也是ES6新增的标准。你还可以自己测试一下其他方法是不是也支持枚举自动排序。比如Object.keys(), for in 等。

增强对象原型

如果你想定义一个对象,你会想到很多方法。

let a = {}

let b = Object.create(a)

function C() {}

class D {}

那么,ES6是如何在这么强大的对象上面继续增强功能呢?

1、允许改变对象原型

改变对象原型,是指在对象实例化之后,可以改变对象原型。我们使用 Object.setPrototypeOf() 来改变实例化后的对象原型。

let a = {
name() {
return 'eryue'
}
}
let b = Object.create(a)
console.log(b.name()) // eryue //使用setPrototypeOf改变b的原型
let c = {
name() {
return "sb"
}
}
Object.setPrototypeOf(b, c)
console.log(b.name()) //sb

2、简化原型访问的super引用

这一个知识你可以看书籍原文,我目前想不到实际业务代码来分析。

方法的定义

ES6明确了方法的定义。

let a = {
//方法
name() {
return 'eryue'
}
}
//函数
function name() {}

估计习惯了函数和方法切换的我们,还是不用太在意这些具体的叫法。

总结

本章讲解了对象字面量语法拓展,ES6新增方法,允许重复的对象字面量属性,自有枚举属性排序,增强对象原型,明确了方法的定义。

我们平时开发中比较常用的是前面4种新增的功能,尤其是Object.assign()的使用。但是,就算把全部新增的功能记住也不是难事。所以,全都记住吧!

=> 返回文章目录

本文转载于:猿2048→https://www.mk2048.com/blog/blog.php?id=h1kbkhjbhaa

《深入理解ES6》笔记——扩展对象的功能性(4)的更多相关文章

  1. ES6学习笔记(8)----对象的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 对象的扩展 1.属性名的简洁表示法 : ES6允许在代码中直接写变量,变量名是属性名,变量值是属 ...

  2. ES6学习笔记(对象)

    1.属性的简洁表示法 const foo = 'bar'; const baz = {foo}; baz // {foo: "bar"} // 等同于 const baz = {f ...

  3. python 进阶读书笔记1 -- 理解python一切皆对象

    理解python一切皆对象: 1.所有的类都是由type创建的 2.所有的类的基类都是object 3.type是类,也是实例,type的基类是object,type对象是由type创建的 4.obj ...

  4. ES6 学习笔记之对象的拓展

    1.属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法.这样书写更加简洁. const foo = 'bar'; const baz = {foo}; baz //{foo: &q ...

  5. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  6. ES6笔记(5)-- Generator生成器函数

    系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...

  7. ES6笔记(3)-- 解构赋值

    系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...

  8. 深入理解 ES6中的 Reflect

    阅读目录 一:Reflect.get(target, name, receiver) 二:Reflect.set(target,name,value,receiver) 三:Reflect.apply ...

  9. ES6笔记之参数默认值(译)

    原文链接:http://dmitrysoshnikov.com/ 原文作者:Dmitry Soshnikov 译者做了少量补充.这样的的文字是译者加的,可以选择忽略. 作者微博:@Bosn 在这个简短 ...

随机推荐

  1. docker学习笔记(2)——docker常用命令

    参考博客: 1.官网教程:https://docs.docker.com/reference/ 可以一边敲命令一边对照官网学习,也可以通过阅读docker --help来学习 2..视频教程:http ...

  2. Tableau怎么制作专业图表

    Tableau怎么制作专业图表 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. 统计表 1.1 不同种类的图表风格 商业周刊的图表风格 经济学人的图表风格 华尔 ...

  3. Azure KeyVault(四)另类在 .NET Core 上操作 Secrets 的类库方法-----Azure.Security.KeyVault.Secrets

    一,引言 上一篇文章我们在 .Net Core Web 项目中添加了 "Microsoft.Azure.KeyVault" 的 Nuget 包操作 Azure KeyVault 的 ...

  4. 借助DBHelper实现学生管理案例分析

    一.案例功能的实现 数据: --专业 create table ProfessionInfo ( ProfessionID int primary key identity(1,1), --专业编号 ...

  5. 如何取消 UIView 动画?

    原文链接 最近项目中有一个需求是需要手动点击相机对焦,这里由于相机对焦部分需要一个类似于系统对焦框一样的缩放动画,同时动画时长为0.3秒,因此这里就有一个很普遍的需求,如果用户在0.3秒内继续点击对焦 ...

  6. SP2940题解

    啃论文的时候论文里面的题. 题意: 区间加 询问区间前缀和之和的最值. 我们先弱化一下问题:将"区间"二字去掉. 我们思考一下一个点可能成为答案的条件.假设现在总共进行的区间加操作 ...

  7. (acwing蓝桥杯c++AB组)1.1 递归

    (acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...

  8. ENVI提取水系并进行生态敏感性分析

    4 具体步骤 4.1 DEM数据拼接 (1)打开ENVI软件,选择[File][Open],添加文件夹DEM数据中的影像,操作如图4.1.1所示,结果如图4.1.2. 图4.1.1 添加DEM数据影像 ...

  9. [SWPU2019] NETWORK

    [SWPU2019]Network(TTL隐写) 1.题目概述 2.解题过程 文档中的数字代表什么呢?会不会是RGB? 看了一下以前做过的题目,好像并不是 那是什么呢?百度告诉我这是TTL隐写,哇,长 ...

  10. Java案例——简单登录

    public class UserLogin { public static void main(String[] args) { //1.定义两个字符串作为已知用户的姓名与密码 String Use ...