[聚合文章] 详谈Javascript类与继承

JavaScript 2017-11-29 16 阅读

本文将从以下几方面介绍类与继承

  • 类的声明与实例化
  • 如何实现继承
  • 继承的几种方式

 

类的声明与实例化

类的声明一般有两种方式

//类的声明var Animal = function () {    this.name = 'Animal';};//ES6中类的声明class Animal2 {    constructor () {        this.name = 'Animal2';    }}    

实例化就比较简单,直接用new运算符

new Animall()new Animal2()

 

 这些比较简单,简单介绍一下就可以了。接下来,介绍本文的重点内容,继承。

如何实现继承

实现继承的方式主要有两种:

第一种借助构造函数实现继承

先看个了例子

function Parent1 () {    this.name = 'parent1';}function Child1 () {    Parent1.call(this); //这里的call用apply也可以    this.type = 'child1';}console.log(new Child1());

 输出结果

可以看到,生成Child1里面有了父级的属性name,实现了继承。为什么就实现继承了呢?

因为在Child1里执行了这句   Parent1.call(this);

在子类的函数体里执行父级的构造函数,同时改变函数运行的上下文环境(也就是this的指向),使this指向Child1这个类,从而导致了父类的属性都会挂载到子类这个类上去,如此便实现了继承。

但这种继承的方法有一个缺点,它只是把父类中的属性继承了,但父类的原型中的属性继承不了。继续上面的代码

Parent1.prototype.say = function () {    console.log("Parent1 prototype")};new Child1().say()

从结果中可以看出 Child1中是没有say方法的,因为say是加在父类的原型上的,这种继承方式只改变父类构造函数在子类函数体中的指向,继承不了原型的属性。

 

 第二种是借助原型链实现继承

原型链这里直接用了,不再详细介绍了,如果对原型链还不是很了解的话,建议先看看这个,详谈Javascript原型链

function Parent2 () {    this.name = 'parent2';    this.play = [1, 2, 3];}function Child2 () {    this.type = 'child2';}Child2.prototype = new Parent2(); //通过把Child2的原型指向Parent2来实现继承

在浏览器中检验一下

可以看到在Child2的实例的__proto__的属性中有Parent2的属性,由此实现了Child2从Parent2的继承。

但这种继承方式也有不足。接着看代码

var s1 = new Child2();var s2 = new Child2();s1.play.push(4);

  console.log('s1.play:'+s1.play);
  console.log('s2.play:'+s2.play);

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。