什么是原型链?
原型链是一种查找规则
为对象成员查找机制提供一个方向
因为构造函数的 prototype 和其实例的 __ proto __ 都是指向原型对象的
所以可以通过__proto__
查找当前的原型对象有没有该属性,
没有就找原型的原型, 依次类推一直找到Object( null ) 为止
这种链式查找过程称之为原型链
什么是闭包?
闭包(closure)指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用
域可以访问另外一个函数内部的局部变量。
function fn() {
var num = 10;
function fun() {
console.log(num);
}
return fun;
}
var f = fn();
f();
优点: 延长变量作用域、在函数的外部可以访问函数内部的局部变量,
缺点: 容易造成内层泄露,因为闭包中的局部变量永远不会被回收 解决方法: 需要手动清除 把变量变为null
继承
Call 式继承继承的是属性,原型继承继承的是方法。
// #1 Call 式继承 / 构造函数继承:继承的是属性
Person.call(this, name, age)
// #2 原型继承:继承的是方法
Star.prototype = new Person()
Star.prototype.constructor = Star
将需要继承的对象挂到当前对象的原型对象上面, 通过原型链访问
子类的原型对象 = 父类的构造函数创建出的对象
特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!
缺点:1、新实例无法向父类构造函数传参。
2、继承单一。
3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原 型属性也会被修改!)
混合式继承
-
遍历父对象成员, 添加给子对象构造函数的原型
-
特点: 多个对象继承, 不会覆盖原来的默认原型
-
缺点: 代码量增多
-
ES6 class类实现继承 :
// 创建一个父类
class father {
// 在 constructor 里面定义实例
constructor(house, car) {
this.house = house
this.car = car
}
// 在外面定义方法
sayHi() {
console.log('你好啊')
}
}
// 实例化 father
const f = new father('汤臣一品', '劳斯莱斯')
console.log(f)
// 子类继承父类
class son extends father {
// 如果没有提供构造函数, 在继承时, 会默认自动借调父构造函数
constructor(house, car, study) {
// 你写的构造函数中, 没有借调父构造函数
super(house, car) // 触发调用父构造函数, 进行实例的属性初始化
this.study = 'study'
}
work() {
console.log('找乐子')
}
}
// 实例化 son
const s = new son('乐高一号', '跑跑卡丁车', '做美食')
console.log(s)
通过class
声明一个类,constructor()
作为构造函数,属性在constructor()
中初始化
可以在class
内定义非静态方法,静态方法绑定在构造器上
类的所有方法都是不可枚举的,也符合内部方法
实例化一个class
必须要new
关键字
extends
实现继承,子类中调用super()
访问父类构造函数