JS的继承

278 阅读1分钟

继承是个啥?

继承就是: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来实现。