前端入门14-JavaScript进阶之继承 (4)

对象有相关的属性指向它的原型,比如 __proto__ ,当运行期间,手动修改对象的原型指向,那么会让这个对象的继承结构(原型链)重建,但不会影响到创建该对象的构造函数原本的行为。

总之,对象的继承结构(原型链)可动态发生变化。

重写

重写:子类覆盖父类的同名方法称为重写。

在JavaScript中,重写跟 Java 很类似,使用某个属性时,先在当前对象内部寻找,如果没找到,才往它的原型链上寻找。

但 JavaScript 中并没有 Java 中的类静态机制,所以定义对象的某个属性时,通常都是动态的写操作来进行,一旦在对象中出现对某个原型属性的写操作,那么就会在该对象内部创建一个同名的属性,之后对这个属性的读写,都是对对象内部这个属性的操作,原型上的同名属性的变化也不会影响到它了。

function A() {} //定义一个构造函数 A.prototype.num = 222; //为构造函数prototype添加一个 num 属性 var a = new A(); a.num; //输出222, a.num = 0; A.prototype.num = 5; a.num; //输出0, 因为num属性已经被重写了 抽象方法

在 Java 中可以定义抽象类,接口,在其中定义一些抽象的方法,子类必须实现这些抽象方法。

但在 JavaScript 中并没有相关的机制,但可以自己通过 throw Error 抛异常形式来模拟这种机制。

比如:

//不允许使用该构造函数创建对象,来模拟抽象类 function AbstractClass() { throw new Error("u can't instantiate abstract class"); } //没有实现的抽象方法,通过抛异常来模拟 function abstractMethod() { throw new Error("abstract method,u should implement it"); } //定义抽象方法,子类继承之后,如果不自己实现,直接使用会抛异常 AbstractClass.prototype.onMearsure = abstractMethod; AbstractClass.prototype.onLayout = abstractMethod;

前端入门14-JavaScript进阶之继承

//定义一个继承抽象构造函数的 function MyClass() {} MyClass.prototype = Object.create(AbstractClass.prototype);

前端入门14-JavaScript进阶之继承

前端入门14-JavaScript进阶之继承

子类继承后,如果不实现直接调用这些方法,会抛异常。

说白了,就是通过抛异常方式来模拟 Java 中的抽象方法机制,这种方式无法让开发工具在编写代码期间就检测出来,需要代码实际运行期间才能发现。

大家好,我是 dasu,欢迎关注我的公众号(dasuAndroidTv),公众号中有我的联系方式,欢迎有事没事来唠嗑一下,如果你觉得本篇内容有帮助到你,可以转载但记得要关注,要标明原文哦,谢谢支持~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxwsw.html