JavaScript中子类调用父类方法的实现

本文探讨了JavaScript中实现继承的多种方式,包括原型链、构造继承、实例继承、拷贝继承、组合继承和寄生组合继承。重点讲述了如何在子类中调用父类方法,通过寄生组合继承的方式,利用`Super.prototype.eat.apply(this, arguments)`实现调用。此外,还介绍了优化后的实现,利用`arguments.callee.father`属性避免硬编码父类名称。文章提供了丰富的代码示例和测试用例,展示了在JavaScript中优雅地实现子类调用父类方法的实践方法。" 16119761,1875117,最长公共子序列问题详解,"['动态规划', 'LCS', '算法', '时间复杂度', '编程']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.**。以下摘录了园友幻天芒JavaScript实现继承的几种方式 的具体介绍以作备忘。

二、JavaScript实现继承的几种方式

既然要实现继承,那么我们首先得有一个基类,代码如下:

  1. // 定义一个动物类
  2.     function Animal(name) {
  3.         // 属性
  4.         this.name = name || 'Animal';
  5.         // 实例方法
  6.         this.sleep = function () {
  7.             console.log(this.name + '正在睡觉!');
  8.         }
  9.     }
  10.     // 原型方法
  11.     Animal.prototype.eat = function (food) {
  12.         console.log(this.name + '正在吃:' + food);
  13.     };

1、原型链继承

核心: 将父类的实例作为子类的原型

  1. //定义动物猫
  2. function Cat() {
  3. }
  4. Cat.prototype = new Animal();
  5. Cat.prototype.name = 'cat';
  6.  
  7. // Test Code
  8. var cat = new Cat();
  9. console.log(cat.name); //cat
  10. cat.eat('fish'); //cat正在吃:fish
  11. cat.sleep(); //cat正在睡觉
  12. console.log(cat instanceof Animal); //true
  13. console.log(cat instanceof Cat); //true

特点:

1.非常纯粹的继承关系,实例是子类的实例,也是父类的实例;

2.父类新增原型方法/原型属性,子类都能访问到;

3.简单,易于实现;

缺点:

1.要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中

2.无法实现多继承;

3.创建子类时,无法向父类构造函数传参;

4.来自原型对象的属性是所有实例所共享;

2、构造继承

核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

  1. function Cat(name) {
  2.     Animal.call(this);
  3.     this.name = name || 'Tom';
  4. }
  5.  
  6. // Test Code
  7. var cat = new Cat();
  8. console.log(cat.name);
  9. console.log(cat.sleep());
  10. console.log(cat instanceof Animal); // false
  11. console.log(cat instanceof Cat); // true

特点:

1. 解决了1中,子类实例共享父类引用属性的问题;

2. 创建子类实例时,可以向父类传递参数;

3. 可以实现多继承(call多个父类对象);

缺点:

1. 实例并不是父类的实例,只是子类的实例;

2. 只能继承父类的实例属性和方法,不能继承原型属性/方法;

3. 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能;

3、实例继承

核心:为父类实例添加新特性,作为子类实例返回

  1. function Cat(name) {
  2.     var instance = new Animal();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值