继承是个啥?
继承就是:A对象通过继承B对象,就能直接拥有B对象的所有属性和方法。
基于原型的继承
JS的各个对象都存在一条原型链,这些对象因为存在某些共有属性而划分为不同的类型,比如Array。将这些共有属性提取出来后,放入这些对象的__proto__中,便实现了属性的继承。 可以总结为:
对象.__proto__ === 其构造函数.prototype
举个例子
function Person(name, age){
this.name = name
this.age = age
}
Person.prototype.sayHi = function(){ //在Person的原型上定义属性
console.log('你好,我是'+this.name)
}
let person = new Person('frank', 18)
person.name === 'frank' // true
person.age === 18 // true
person.sayHi() // 打印出「你好,我叫 frank」
let person2 = new Person('jack', 19)
person2.name === 'jack' // true
person2.age === 19 // true
person2.sayHi() // 打印出「你好,我叫 jack」
基于 class 的继承
在ES6中,我们的Class之间可以通过extends关键字实现继承(在 JS 中并不存在类,class 的本质就是函数)。
class Person{
constructor(name, age){
this.name = name
this.age = age
}
sayHi(){
console.log('你好,我是'+this.name)
}
}
let person = new Person('frank', 18)
person.name === 'frank' // true
person.age === 18 // true
person.sayHi() // 打印出「你好,我叫 frank」
let person2 = new Person('jack', 19)
person2.name === 'jack' // true
person2.age === 19 // true
person2.sayHi() // 打印出「你好,我叫 jack」
两种代码比较一下就可以看见,class的定义包含了构造函数constructor和定义在原型对象上的函数sayHi()(注意没有function关键字)
避免了Person.prototype.sayHi = function() {...}这样分散的代码。
用class定义对象的另一个优点就是继承更方便了。现在我们从Person派生一个OnePerson。现在原型对象的构造函数等等都不需要考虑了,可以通过extends来实现。