本文将从以下几方面介绍类与继承
- 类的声明与实例化
- 如何实现继承
- 继承的几种方式
类的声明与实例化
类的声明一般有两种方式
//类的声明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);
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。