javascript - 原型
2021-03-08 09:51:54 0 举报
AI智能生成
javascript 原型 class
作者其他创作
大纲/内容
创建多个相似对象
工厂模式
创建多个对象相似的问题
创建函数,return 一个对象
缺点
功能相同的每个方法都要在每个对象上重新创建一次,空间内容没有得到优化
构造函数模式
添加new 实例调用方法, 去除显示定义的对象,用this代替原有对象,构造函数默认返回this,不需要return
缺点
功能相同的每个方法都要在每个对象上重新创建一遍,空间内存没有得到优化
原型模式
func.prototype 就是原型,它是一个对象,称为原型对象
通过func.prototype.method 可以共享方法,不会反复开辟空间存储方法
原型的this指向实例
继承
原型链
原型与原型层层相连接的过程为原型链
子类的prototype赋值了父级的实例,实现了对父级的继承: SubType.prototype = new SuperType()
子类在创建新的方法或覆盖父类的方法需要在赋值之后
以对象字面量方式创建原型方法会破坏原型链
原型链的问题
使用原型实现继承时,原型实际上变成了另一个类型的实例,意味着原先实例属性摇身一变成为了原型属性(原型中包含的引用值会在所有实例中共享)
子类型在实例化时不能给父类型的构造函数传参
盗用构造函数
在子类函数中调用父类函数,使用call() 或 apply()方法
优点:可以给父类传递参数
问题
必须在构造函数中定义方法,因此函数不能重用
子类不能访问父类原型上定义的方法
组合继承
使用原型链继承原型上的属性和方法,通过盗用构造函数继承实例属性
优点:可以给父类传递参数和继承父类的方法
原型式继承
Object.create(objectName, descriptor)
寄生式继承
创建一个实现继承的函数,以某种方式增强对象,返回这个对象
寄生式组合继承
类 class
class 关键字 + 大括号定义
类声明 class Person {}
类表达式 let Person = class {}
类的构成
构造函数方法 constructor
实例方法
获取函数方法
静态类方法
创建对象方法
创建Object的实例 let person = new Object(); person.name = 'abc'
对象字面量 let person = {a: 1}
属性的分类
数据属性
特性
[[Configurable]]
表示属性是否可以通过delete删除, 默认 true
[[Enumerable]]
表示属性是否可以 for-in 循环返回, 默认true
[[Writable]]
表示属性是否可以被修改,默认true
[[Value]]
包含属性实际的值,默认undefined
Object.defineProperty() 修改默认属性特性
接收三个参数
添加属性的对象
属性名称
描述符对象
configurable
enumerable
writable
value
访问器属性
特性
[[Congiurable]]
表示属性是否可以delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性; 默认true
[[Enumerable]]
表示属性是否可以通过for-in循环返回;默认true
[[Get]]
获取函数,读取属性时调用; 默认undefined
[[Set]]
设置函数,设置属性时调用;默认undefined
访问器属性不能直接定义,须使用Object.defineProperty()
定义多个属性 Object.defineProperties(); 通过多个描述符一次性定义多个属性
接收两个参数
添加或修改的属性的对象
描述符对象
读取属性特性
Object.getOwnPropertyDescriptor(objectName, 'attributeName');返回一个对象包含该属性的特性
Object.getOwnPropertyDescriptors(ObjectName); 返回一个对象包含所有属性的特性
合并对象
Object.assign(目标对象, 源对象)
展开运算符(...)
收藏
收藏
0 条评论
下一页