理解对象
ECMA-262对象定义为一组属性的无序集合
1.属性的类型
类型:数据属性和访问器属性数据属性:
数据属性:
1.Configurable:表示属性是否可以通过delete删除并定义,是否可以修改它的特性,以及是否可以把它修改为访问器属性
2.Enumberable:表示属性是否可以通过for-in循环返回
3.Writable:表示属性的值是否可以被修改
4.Value:包含属性实际的值
访问器属性:
1.Configurable:表示属性是否可以通过delete删除并重新定义
2.Enumerable:表示属性是否可以通过for-in循环返回。
3.Get:获取函数,在读取属性时调用
4.Set:设置函数,在写入属性事调用
2.定义多个属性
Object.defineProperties()方法
Object.defineProperties(book,{
year_:{
value:2023
},
name_;{
value:'shiren'
get(){
return this.name
},
set(newValue){
return this.name = newValue
}
},
)
3.读取属性的特性
Object.getOwnPropertyDescriptor()方法可以取得指定属性的属性描述符
如读取value、enumerable、get()、set()等
4.合并对象
Object.assign()
5.对象标识符及相等判定
ES6之前===操作符不严谨,如console.log(+0===-0) true
ES6新增了Object.is()判断
6.增强的对象语法
1.属性值简写
2.可计算属性
3.简写方法名
7.对象解构
如 let person = {
name='shiren';
age='26'
job:{
title:'happyNewYear'
}
}
let{name} = person
//也可以定义默认值
let { name,job='Soft engineer'} = person
//嵌套解构
let {job:{title}} =person
//2.部分解构
//开始赋值成功,后面的赋值出错,整个解构赋值智慧完成一部分
//3.参考上下文匹配
创建对象
1.概述
ES6正式支持类和继承
2.工厂模式
工厂模式是一种设计模式
必须有return o
3.构造函数模式
没有return
4.原型模式
每个函数都会创建一个prototype属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法
5.对象迭代
Object.values(Object obj)返回为对象的值的数组
Object.entries(Object obj)返回为对象的键值对的数组
继承
通过原型链实现
1.原型链
ECMA-262把原型链定义为ECMAScript的主要继承方式。
基本思想:通过原型继承多个引用类型的属性和方法
1.默认原型:任何函数的默认原型都是一个Object的实例
2.原型与继承关系:可以通过instanceof操作符或者isPrototypeOf()方法
3.关于方法:子类有时候需要覆盖父类的方法,或者增加父类没有的方法
4.原型链的问题:原型包含的引用值会在所有实例间共享
2.盗用构造函数
作用:为了解决原型包含引用值导致的继承问题
方法:通过使用call()或apply()方法
优点:可以传递参数
问题:必须在构造函数中定义方法,因此函数不能重用
3.组合继承
综合了原型链和盗用构造函数
4.原型式继承
Object(Object obj)是传入的对象进行一次浅复制
应用场景:在对象的基础上创建一个新对象
ES5通过Object.create(Object obj,[option]】)方法将原型式继承的概念规范化了
5.寄生式继承
思路:以某种方式增强对象,然后返回这个对象
6.寄生式组合继承
基本思路:不通过调用父类构造函数给自雷原型赋值,而是取得父类原型的一个副本
类
1.类的定义
两种方式:类声明和类表达式
class Person{}
const Animal = class {}
2.类构造函数
constructor关键字用于在类定义块内部创建类的构造函数。
方法名constructor会告诉解释器在使用new 操作符创建类的新实例时,应该调用这个函数
new调用类会执行以下操作
1.在内存中创建一个新对象
2.在这个新对象内部的Prototype指针被赋值为构造函数的prototype属性
3.构造函数内部的this被赋值为这个新对象
4.执行构造函数内部的代码
5.如果构造函数返回非空对象,则返回该对象
3.实例、原型和类成员
实例成员:每次通过new调用类标识符时,都会执行类构造函数。在这个函数内部,可以为新创建的实例,添加自有的属性,在构造函数执行完毕后,仍然可以给实例继续添加新成员
原型方法与访问器
为了在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法
静态类方法在类中使用static关键字作为前缀。在静态成员中,this引用类自身。
非函数原型和类成员,虽然累定义并不显式支持在原型或类上添加成员数据,但在类定义外部,可以手动添加
迭代器与生成器方法,static *createJobIterator(){
yield ‘Butcher’;
yield "Baker“;
yield ‘J-Dog’;
;}
迭代器
*Symbol.iterator{
yield * this.nicknames.entries();
}
4.继承
基础继承,使用extends关键字,就可以继承任何拥有Construct和原型的对象
派生类可以通过super关键字引用它们的原型。这个关键字智能在派生类中使用