继承的N种方式
子类能够使用父类的属性和方法
原型链继承
- 创建人的类
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)
组合式继承
// 创建人的类 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()