第八章 对象、类与面向对象编程
对象属性的可配置值:
以前做的有,此处略
合并对象
Object.assign()
- 将每个源对象中可枚举的属性添加到目标对象中
对象标识及相等判定
Object.is()
对象属性简写
let name = "meta";
let obj = {
name: name,
}
// 等价于
let obj = {
name
}
对象属性引用[]
let key1 = "name"
let obj = {
[key1]: "meta",
}
// 等价于
let obj = {
name: "meta"
}
对象方法简写
let obj = {
say: function () {}
}
// 等价于
let obj = {
say() {}
}
对象解构
let obj = { a: 1, b: 1 }
const { a, b } = obj
创建对象
工厂模式
一个函数,根据参数生成对象,并返回这个对象
构造函数模式
要创建Person的实例,应使用new操作符。以这种方式调用构造函数会 执行如下操作。
(1) 在内存中创建一个新对象。
(2) 这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
(3) 构造函数内部的this被赋值为这个新对象(即this指向新对象)。
(4) 执行构造函数内部的代码(给新对象添加属性)。
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
原型模式
在构造函数的原型对象(prototype
)上绑定变量和方法, 即便构造函数中没有任何内容,通过该构造函数创建的对象仍旧能通过原型链的形式访问到数据
继承
原型链继承
ECMA-262把原型链定义为ECMAScript的主要继承方式。
其基本思想就是通过原型继承多个引用类型的属性和方法。
盗用构造函数
基本思路很简单:在子类构造函数 中调用父类构造函数。因为毕竟函数就是在特定上下文中执行代码的简对象,所以可以使用apply()和call()方法以新创建的对象为上下文执行构造函数。
总的来说就是在新的构造函数中通过 apply 和 call 调用其它构造函数,通过改变this指向和传入参数,继承属性。
组合继承
组合继承(有时候也叫伪经典继承)综合了原型链和盗用构造函数,将两者的优点集中了起来。基本的思路是使用原型链继承原型上的属性和方法,而通过盗用构造函数继承实例属性。这样既可以把方法定义在原型上以实现重用,又可以让每个实例都有自己的属性。
由于原构造函数的原型对象上还定义有别的属性,所以在实例化时,同时对新构造函数的原型对象进行赋值,这样新构造函数的原型对象在原来的基础上也继承了原构造函数原型对象上的自定义属性。
原型式继承
原型式继承适用于这种情况:你有一个对象,想在它的基础上再创建一个新对象。你需要把这个对象先传给object(),然后再对返回的对象进行适当修改。
总的来说,就是写一个函数,在内部创建一个构造函数,进行原型链的继承,然后返回一个这个构造函数的实例化对象
寄生式继承
寄生式继承在红宝书的案例上看来,是在原型式继承的基础上,先调用原型式继承生成对象,再对这个对象做一些处理,最后将这个对象返回出去
寄生式组合继承
寄生式组合继承通过盗用构造函数继承属性,但使用混合式原型链继承方法。基本思路是不通过调用父类构造函数给子类原型赋值,而是取得父类原型的一个副本。说到底就是使用寄生式继承来继承父类原型,然后将返回的新对象赋值给子类原型。
网友评论