原型继承
js中有原型的概念, 通过原型我们可以实现继承.
定义一个函数为animal, 在其原型上定义一个sayHello函数. 并生成一个新对象dog.
function Animal(name){
this.name = name
}
Animal.prototype.sayHello = function() {
console.log('hello')
}
var dog = new Animal('dog')
console.log(dog)
//{name: "dog"}
打印dog返现dog是一个对象, 它并没有其他方法. 但是我们可以在dog对象上使用sayHello函数
dog.sayHello()
//hello
当普通函数加上new时, 就变成了构造函数. 构造函数的prototype属性指向其原型.
new+构造函数生成一个实例对象, 这个实例对象有一个__proto__
属性也指向原型.
当实例对象调用某一个方法时, 会在自身属性中查找, 若没有则通过__proto__
属性向原型查找.
这样通过原型链的方式我们可以实现继承.
class继承
class继承和原型继承类似.
class Animal {
constructor(){
console.log('这是class的构造函数')
}
sayHello(){
console.log('hello')
}
}
class Dog extends Animal {
constructor(name){
super()
this.name = name
}
}
var dog = new Dog('dog')
console.log(dog)
//{name: "dog"}
dog.sayHello()
//'hello'
class中的除了contructor表示构造函数, 其他一律为原型中的属性. Dog通过extends关键字继承自Animal. dog是Dog的实例, 当dog没有sayHello方法时, 变回向其父类寻找该方法.