在Java中,我们在实现继承的时候存在下面几个事实:
1、准备两个类,他们用extends关键字链接起来
2、如果超类没有默认构造函数,需要在子类构造函数中显式的super并传参,如果都是默认构造函数也可以super,不super虚拟机是自动的
3、子类可追加,覆盖,重载方法,子类可以有自己的私有属性,他们在子类构造函数中被构造
4、字段是数据,方法在代码区,和类建立方法表,同一个类的对象有自己的数据但是共享方法代码
比如有两个类,Plane和Space,Plane表示平面,Space表示空间,Space是Plane的子类,在java中
|
那么在js中也一样,区别是代码要放到构造函数(可以理解为Java中的类)的原型上,原型是放置方法和不变属性的理想场所,原型是一个对象,它和普通对象唯一不同的就是他有一个constructor属性指向它所依附的构造器,在java中子类查找属性和方法是通过虚拟机来完成,但是在js中需要通过原型链来完成。也就是说继承关系对程序员是不透明的,需要了解这个原型机制,原型机制上存在两条链,一是原型链,二是构造函数链。
仿照上面java的代码,我们可以完成js的写法,如下:
|
JS中函数的this指函数的调用者,不管是java还是js,this都可理解为新分配的那段容纳对象的内存。在java中通过SpaceextendsPlane,虚拟机就维护好了他们的继承关系以完成继承关系的自动查找,但是在js中需要我们手动的处理,在这个时候Space是调用不到XY这个方法的,因为他们没有在原型链上。我们可以开发一个函数来模拟java的关键字extends,比如这个函数叫做extend,通过执行extend(Plane,Space)完成原型链的组装。