继承
子类能够使用父类的属性和方法
原型链继承
-
创建人的类
function Person(name, age) { this.name = name this.age = age } Person.prototype.say = function () { console.log('说话了') } const p1 = new Person('张三', 19)
-
创建狗的类
function Dog(name, age) { this.name = name this.age = age } Dog.prototype.say = function () { console.log('说话了') } const d1 = new Dog('大黄', 3)
-
狗继承自人的类
// 创建人的类 function Person(name, age) { this.name = name this.age = age } Person.prototype.say = function () { console.log('说话了') } function Dog() { } // 此方式不推荐 子原型和父原型公用同一个原型 // Dog.prototype = Person.prototype Dog.prototype = new Person() const d1 = new Dog('大黄', 3)
以上则实现原型链继承但是会有以下问题:
-
包含引用类型值的原型属性会被所有的实例共享
function Person(name, age) { this.name = name this.age = age this.hobby = [] }
-
创建子类的时候不能传递参数
借用构造函数继承
-
创建人的类
// 创建人的类 function Person(name, age) { this.name = name this.age = age this.hobby = [] }
-
通过call实现
function Dog(name, age) { Person.call(this, name, age) } const d1 = new Dog('大黄', 2) const d2 = new Dog('小黄', 1) d1.hobby = '吃吃吃'
组合式继承
// 创建人的类
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function () {
console.log('说话了')
}
function Dog(name,age) {
Person.call(this,name,age)
}
// 此方式不推荐 子原型和父原型公用同一个原型
// Dog.prototype = Person.prototype
Dog.prototype = new Person()
const d1 = new Dog('大黄', 3)
const d2 = new Dog('小黄', 2)
寄生式组合继承
Object.create作用:
- 创建对象
- 将对象的__proto__ 指向参数对象
// 创建人的类
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function () {
console.log('说话了')
}
function Dog(name,age) {
Person.call(this,name,age)
}
// 此方式不推荐 子原型和父原型公用同一个原型
// Dog.prototype = Person.prototype
Dog.prototype = Object.create(Person.prototype)
const d1 = new Dog('大黄', 3)
const d2 = new Dog('小黄', 2)
es6类继承
class Person {
say () {
console.log('说话了')
}
}
class Child extends Person {
}
const child = new Child()
child.say()