《JavaScript高级程序设计》阅读笔记 三

包含:第七章和第八章

说两下:用块引用就是图好看


迭代就是按照顺序反复多次执行一段程序

迭代器模式

1.迭代器是按需创建的一次性对象,每个迭代器都会关联一个可迭代对象。迭代器无需了解可迭代对象的结构,只需要直到如何取得连续的值。这正是Iterable和Iterator的强大之处.

2.我们把实现Iterable接口的结构,称之为可迭代对象(支持迭代自我识别能力和创建实现Iterator接口的对象能力)

3.显式调用工厂函数生成迭代器 AA[Symbol.iterator]

不需要使用显式调用,可以用原生语言特性自动兼容:

for of循环,数组解构,扩展操作符,Array,from(),创建集合,创建映射等等(剩下三未学

4.迭代器API使用next()方法在可迭代对象中遍历,每次成功调用next()就会返回IteratorResuit对象(包含done和value)

后续的自定义迭代器和提前终止,不了解,未懂

生成器

1.生成器的形式是一个函数,函数名称那面加一个星号表示它是一个生成器。

后调用生成器函数,产生生成器对象。由于生成器对象有next()方法,同时可以用此方法与yield关键字配合,实现在生成器的中断与执行。

2.默认生成器关闭,每次调用next()(迭代就是用next),便执行函数,直至遇到yield关键字(yield所在行仍然会执行)

3.生成器对象可作为可迭代对象,先执行生成器函数,再执行主函数。

把yield之前的作用域算作迭代的一次。

4.yield不仅可以作为函数的中间返回语句,还可以作为函数的中间参数使用。

yield会接受next()方法传的值。注意:第一次next()传值无效,因为第一次是生成函数的执行(懂了但没完全懂

yield可以产生值

5.yield加星号,可以迭代可迭代对象。但迭代一次,算一次next().用星号迭代,使生成器成为迭代器更加方便

6.使用return()与抛出异常处理一次,生成器便会关闭.

小结一下,本章学习了迭代器与生成器.某个结构满足接口迭代器接口协议,就可以调用[Symbol.iterator]()方法,产生迭代器.当然自带的结构一般有更好多的方法,产生更好的迭代器.迭代器以next()为重点,next就是访问下一个元素,并且返回done和value.

生成器,是一种特殊的函数,函数名字前加*便可声明为生成器.生成器满足迭代器接口协议,所以也能调用next()方法.生成器核心为yield,yield与next()联系,可以控制生成器函数的执行;yield可以接受next()参数,产生value值;关键的是yield前加*可以迭代后面的可迭代对象.

下面一章便是面向对象了,加油(ง •_•)ง


理解对象

1.规定对象为一组属性的无序集合.

2.ECMA使用一些内部特性来描述属性的特征,使用两个中括号[[]]访问,数据属性和访问器属性

3.数据属性包含一个保存数据值的位置,值从此读取和写入.

[[Configurable]]是否可删除和定义,[[Enumerable]]是否可以通过forin返回[[Writable]]是否可以被修改,[[Value]]包含属性的实际值

4.访问器属性包含两个非必需函数,get()获取值与set()修改值

5.如果定义一个对象一个属性可以用Object.defineProperty(对象,属性,{数据属性:XX})方法

如果定义一个对象多个属性可以用Object.defineProperties(对象{字面量上下文})方法

6.可以用Object.getOwnPropertyDescriptor()方法,获取一个对象,对访问器属性包含,configurable,enumerable,get和set属性;数据属性包含configurable,enumerable,writable,value属性。

7.Object.assign(目标,材料)合并对象,给目标添加上,同时返回已经添加的。只是复制的引用,没有复制值,相当于创建了一个快捷方式。

8.Object.is(XX,XX)判断对象。与===相似

9.有用的语法糖:

1.如果对象属性名与属性键相同,则可以简写。

let name1 = `小明`;
let person1 = {
    name1,
}
console.log(person1.name1);
//等价于
let name2 = `小红`;
let person2 = {
    name2 : name2,
}
console.log(person2.name2);

2.用可计算属性,快速换成动态属性赋值

let name123 = 'name';
let age123 = 'age';
let a = new Object();
a[name123] = '小明';
a[age123] = '19';
console.log(a);
//同理
let b = {
    [name123] : '小红',
    [age123] : '20'
}
console.log(b);

3.简化方法名(一直都在用)

let b = {
    a : function () {
        console.log("HelloWorld")
    },
}
b.a();
//等价于
let c = {
    a () {
      console.log("HelloWorld")  
    }
}
c.a();

4.对象解构(以下均为解构方法)

let a = {
    age : '17',
    name : `a`,
}
let {name : personName, age : personAge } = a;
console.log(personName);
console.log(personAge);
({name, age} = a);
console.log(name);
console.log(age);

小结一下,关于理解对象。对象拥有两种属性,一种为数据属性(对于一个值),一种为访问器属性(也是一种值,不过是用来访问的)。另外说了Object的多个静态方法,Object.defineProperty,Object.getOwnPropertyDescriptor,Object.assign,Object.is。

一些语法糖,比如属性键与属性值相同时,可以直接写。用【】实现动态属性赋值,简化方法,对象解构。现在对对象本身有所了解了,下一部分,讲学习创建对象。

ES6开始正式支持类和继承。仍基于原型的继承模式,ES6的类是封装了ES5的构造函数加原型继承的语法糖。

创建对象

1.工厂模式

调用一个函数(包含创建变量到返回变量的一件套),得到返回值,当作对象。

2.构造函数模式(可以用函数声明形式写,,也可以用赋值给变量的函数表达式写)

与工厂模式相似,但没有显式的创建对象,属性和方法直接赋值给了this,没有return。用new操作符得到构造函数实例。

习惯构造函数首字母大写,其他函数首字母小写。构造函数也是函数,任何函数只要使用new操作符调用就是构造函数。

3.原型模式

每个函数都会创建一个prototype属性,这个属性是一个对象。当调用原型模式的函数构造对象时候,prototype对象会被新建对象共享。

①只要给对象实例添加一个属性,这个属性就会遮盖原型对象上的同名属性,可以用delete操作符完全删除实例上的这个属性。

②可以用.hasOwnProperty()方法判断是否为自身拥有的属性

③查用in操作符查看是否存在属性

4.对象迭代

可以用Object.keys()静态方法获取对象上所有可枚举的实例属性

可以用Object.values()和Object.entries获取他们内容的数组

下面是原型链(由于书本内容没看懂,总结个人经验

前提:prototype是函数的一个属性(也是一个对象),指向构造函数的原型。__proto__是对象的一个属性,指向构造对象的构造函数的protype。形成一个链条:比喻图,一个函数就是一个热气球,下面的筐子彼此相连通过一个点,而地上的对象连接着热气球的筐子。

万物起源函数论(误

Function创造了Function,所以Function.__proto__===Function.prototype。

后同源Object也诞生,但Object的prototype属性为Null。

对于方法来说,方法也是对象,方法由new Function()创造。

对于对象来说,由构造函数(new Object()某种意义上也算是)创造,构造函数由new Function()创造。

类是语法糖,本质还是原型和构造函数

类(特殊的函数

1.创建方式Class Person {}或const Animal = class {}

2.类可以包含构造函数方法,实例方法,获取函数设置函数(访问器,和静态方法。

3.构造方法

new操作符实例化类,且调用它的构造函数(十分类似Java的构造器

4.实例方法

每次实例类,都是建立一个新的对象,不会共享

5.在类块上定义所有的内容都会定义在类的原型上,但只能定义方法与函数

6.可以在外部,在类上定义数据成员和在原型上定义数据成员可以继承任何拥有

7.继承

可以继承任何拥有[[Construct]]和原型的对象。不仅可以继承一个类,也可以继承普通的构造函数。用super,可以使用父类的构造函数。super只能在构造函数中使用。

可以用如下代码实现抽象基类

constructor() {
 if (new.target === XX) {
    throw new Error('这是抽象类');
     }
}

混入模式被很多框架抛弃,提取到独立的类和辅助对象中。

小结一下,类可以包含很多方法(顺便可以回顾过去,比如迭代器与生成器,访问器,普通方法,构造方法。类也可以在外部定义类上数据成员与原型上数据成员。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值