Javascript继承

Javascript的继承和传统的OO语言不一样,有一些特别的地方需要我们去注意。文章作为阅读红皮书(JS高程)的笔记,记录Javascript语言中的继承方式。

1.原型链继承

function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function() { return this.property; } function SubType() { this.subproperty = false; } // 继承 SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function() { return this.subproperty; } const instance = new SubType(); instance.getSuperValue() // 输出SuperType中的true

原型链继承有它的缺点,就是包含引用类型值的原型属性会被所有实例共享,如下面这个例子

function SuperType() { this.colors = ['red', 'blue', 'green']; } function SubType() { } SubType.prototype = new SuperType(); const instance1 = new SubType(); instance1.colors.push('black'); alert(instance1.colors); // "red, blue, green, black"; const instance2 = new SubType(); alert(instance2.colors); // "red, blue, green, black";

这个例子中的colors就是一个会被所有实例共享的对象。

原型继承的另一个缺点是在创建子类的实例时,不能向超类的构造函数传递参数。

2.借用构造函数(经典继承)

function SuperType() { this.colors = ['red', 'blue', 'green']; } function SubType() { // 继承 SuperType.call(this); } const instance1 = new SubType(); instance1.colors.push('black'); alert(instance1.colors); // "red, blue, green, black"; const instance2 = new SubType(); alert(instance2.colors); // "red, blue, green";

通过SuperType.call(this)在SubType的对象上执行SuperType函数中定义的所有对象初始化代码。

并且借用构造函数还可以传递参数

function SuperType(name) { this.name = name; } function SubType() { // 继承 SuperType.call(this, 'Michael'); this.age = 25; } const instance = new SubType(); alert(instance.name); // 'Michael' alert(instance.age); // 25

但借用改造函数继承也有它的缺点,即无法避免构造函数模式存在的函数复用的问题,因为所有的方法都在构造函数中定义。

3.组合继承(伪经典继承)

组合继承将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。

思路是使用原型链实现对原型属性和方法的继承,而通过构造函数来实现堆实例属性的基继承。

function SuperType(name) { this.name = name; this.colors = ['red', 'blue', 'green']; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name, age){ // 继承属性 SuperType.call(this, name); this.age = age; } // 继承方法 SubType.prototype = new SuperType(); SubType.prototype.sayAge = function() { alert(this.age); } const instance1 = new SubType('Michael', 25); instance1.colors.push('black'); alert(instance1.colors); // "red, blue, green, black" instance1.sayName(); // "Michael" instance1.sayAge(); // 25 const instance2 = new SubType('John', 27); alert(instance2.colors); // "red, blue, green" instance2.sayName(); // "John" instance2.sayAge(); // 27

本文内容由用户注册发布,仅代表作者或来源网站个人观点,不代表本网站的观点和立场,与本网站无关。本网系信息发布平台,仅提供信息存储空间服务,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。如因作品内容侵权需删除与其他问题需要同本网联系的,请尽快通过本网的邮箱或电话联系。 
THE END
分享
二维码
< <上一篇
下一篇>>