浅谈JavaScript中的继承

本文详细讲解了原型继承原理,组合继承的运用(包括call和apply方法),以及寄生组合继承的优化。重点介绍了ES6中class的继承机制,通过实例演示了`Person`和`Student`类的继承过程。

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

原型继承:

通过改造原型链,利用原型链的特性,实现继承方法
(需要掌握原型、原型链)

在这里插入图片描述

组合继承:

将 原型链 和 借用构造函数 技术组合到一起,通过原型链实现对原型属性和方法的继承(主要是方法),而通过借用构造函数来实现对实例属性的继承
(需要掌握call、apply方法的用法和区别)

  function Person(name,age){
        this.name = name 
        this.age = age
    }
    Person.prototype.say = function(){
        console.log('会说话');
    }

    function Student(name,age,className){
        // this.name = name
        // this.age = age

// 借用构造函数Person,通过call方法
// 1. 调用构造函数
// 2. 让执行构造函数时的this指向Student的实例stu
        Person.call(this,name,age)

        // 如果构造函数中的实例属性很多,也可以用apply方法,里面的第二个参数用arguments表示所有的属性
        // Person.apply(this,arguments)
        this.className = className
    }

// 改造原型链   
    Student.prototype = new Person()


    Student.prototype.study = function(){
        console.log('学生在学习');
    }

    let stu = new Student('zs',18,'大一')
    stu.say()
    stu.study()
    console.log(stu);

寄生组合继承:

Student实例上有name,age属性,而__proto__上不需要再有这些属性,所以利用 Object.create 优化下
Object.create(参数对象) :

  1. Object.create 会创建一个新对象
  2. 并且这个新对象的__proto__会指向传入的新对象

在这里插入图片描述
寄生组合继承,其实是在组合继承的基础上,优化一下代码逻辑。

ES6—class实现继承

着重记住三个关键点:classextendssuper

// 人类
    class Person {  // class其实是一个语法糖  类似于之前的构造函数,不过把实例属性和方法都
    				//集中到了一起管理维护,注意Person后面是没有括号的,固定格式

        // 构造器 里面存放实例属性
        constructor(name,age){
            this.name = name
            this.age = age
        }
        // 底层=> 这两个方法,添加到Person.prototype
        say(){
            console.log('会说话');
        }
        //注意方法之间是没有逗号的
        jump(){
            console.log('会跳');
        }
    }
    const p = new Person('zs',18)
    p.say()

// 学生类
    class Student extends Person{   
        //如果没有提供构造器,在继承时,会默认借调父构造函数
       constructor(name,age,className){
        //super()触发调用父构造函数,进行实例的属性初始化,
        //注意要先继承再添加自己的属性,也就是super要写在className的声明前面
        super(name,age) 
        this.className = className
       }
    }
    const stu = new Student('ls',22,'大四')
    stu.jump()
    console.log(stu);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值