所有对象都有proto属性,指向构造该对象的构造函数的prototype function Person() { this.name = ‘name’ } var person1 = new Person() person1._proto = Person.prototype
构造函数 constructor
function Person() { this.name = ‘name’ } var person1 = new Person() person1.constructor = Person person1._proto.constructor = Person.prototype.constructor = Person
简单原型链继承
1
2
3
4
5
6
7
8
functionSuper() {
this.name = 'super'
}
functionSub() {
}
// 利用原型链实现继承, 缺点:包含引用类型值的原型属性会被所有实例共享
Sub.prototype = new Super()
构造函数继承
1
2
3
4
5
6
7
functionSuper() {
this.name = 'super'
}
// 缺点:方法都只能在构造函数中定义,没有办法实现方法的复用
functionSub() {
Super.call(this, ...arguments)
}
组合式继承
使用原型链实现对原型方法的继承,使用构造函数实现对实例属性的继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
functionSuper() {
this.name = 'super'
}
Super.prototype.sayName = function() {
returnthis.name
}
functionSub() {
// 通过 构造函数继承属性
Super.call(this, ...arguments)
}
// 利用原型链实现继承, 缺点:包含引用类型值的原型属性会被所有实例共享
Sub.prototype = new Super()
// 重写了 Sub 的 prototype 属性,因此其 constructor 也被重写了,需要手动修正