Javascript 如何实现继承?

本文介绍了JavaScript中实现继承的方法,包括ES5的原型继承、借用构造函数和组合继承,以及ES6通过`class`和`extends`关键字进行的类继承。通过`super()`调用父类方法是ES6继承的一大特点。

Javascript 如何实现继承?

答:JS 继承实现⽅式也很多,主要分 ES5 和 ES6 继承的实现

1.  先说⼀下 ES5 是如何实现继承的

    ES5 实现继承主要是基于 prototype 来实现的,具体有三种⽅法

    ⼀是实例继承:即 B.prototype=new A() 让 b 的原型等于 a 的实例

function Animal() {
            this.type = "动物";
        }
        Animal.prototype.run = () => {
            console.log("动物都会跑");
        };

        function Dog(name) {
            this.name = name;
        }
        Dog.prototype = new Animal();
        Dog.prototype.constructor = Dog;
        //实例继承后再让constructor指回dog
        Dog.prototype.wang = () => {
            alert("修勾汪汪叫");
        };
        let dog1 = new Dog();
        console.log(dog1.type);
        dog1.run();

    ⼆是借⽤构造函数继承(call 或者 apply 的⽅式继承)

    function B(name,age) {

    A.call(ths,name,age)

    }

function Animal(type) {
            this.type = type;
        }
        Animal.prototype.run = () => {
            console.log("动物都会跑");
        };
        let cat = new Animal("小猫");
        alert(cat.type)

        function Dog(color, type) {
            Animal.apply(this, [type]) 

        //apply在这里会让animal方法执行并且把this变成了dog的实例
        // 也能写成:
        // Animal.call(this,type) //apply在这里会让animal方法执行并且把this变成了dog的实例
        // 这里 可以用apply和call 都可以 区别是 apply的第二个参数是一个数组,call的参数可以用逗号隔开写
        //让animal里的this指向dog的实例

            this.color = color;
        }

        Dog.prototype.wang = () => {
            alert("修勾汪汪叫");
        };

        let dog2 = new Dog("黄色", "小狗");
        console.log(dog2.type);
        console.log(dog2.color);
        // dog2.run()//报错 因为run不在构造函数里
        // 第二种继承 是借用构造函数继承 这种继承只能继承父类构造函数的里的属性或者方法
        // 第二种比第一种好处是 要继承的父类里的构造函数里的属性也可以自定义

    三是组合继承

    组合继承是结合第⼀种和第⼆种⽅式

2.  再说⼀下 ES6 是如何实现继承的

    ES6 继承是⽬前⽐较新,并且主流的继承⽅式,⽤ class 定义类,⽤ extends 继承类,⽤ super()表示

    ⽗类,【下⾯代码部分只是熟悉,不⽤说课】

    例如:创建 A 类

    class A {

    constructor() {

    //构造器代码,new 时⾃动执⾏

    }

    ⽅法 1( ) { //A 类的⽅法 }

    ⽅法 2( ) { //A 类的⽅法 }

    }

    创建 B 类并继承 A 类

    class B extends A {

    constructor() {

    super() //表示⽗类

    }

    }

    实例化 B 类: var b1=new B( )

    b1.⽅法 1( )

<think>好的,我现在需要回答用户关于JavaScript如何实现继承的问题。用户可能希望了解不同的继承方法,以及它们的优缺点。虽然用户要求用Java代码,但问题本身是关于JavaScript的,所以可能需要指出这一点,但按照用户要求,只能提供Java代码示例。不过这可能存在矛盾,因为Java和JavaScript继承机制不同。需要确认用户是否混淆了两种语言,但按照用户指示,必须用Java代码,所以可能需要调整回答,用Java来模拟类似JavaScript继承方式,或者解释JavaScript继承机制,但提供Java代码示例可能有误导。这里可能需要先澄清,但根据用户的要求,必须回答JavaScript继承,但代码只能是Java。这可能有问题,但需要按照用户的要求来处理。 接下来,我需要回顾JavaScript中的继承实现方式,如原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承,以及ES6的class语法。然后,用户可能希望得到这些方法的Java代码示例,但Java和JavaScript的机制不同,所以如何用Java代码来展示JavaScript继承方式呢?这可能不太可行,可能需要解释JavaScript方法,然后指出在Java中对应的继承方式,但用户的问题是关于JavaScript的,所以可能需要先回答JavaScript实现方法,然后给出相关问题。 但根据用户的要求,回答必须包含Java代码,这可能产生矛盾。可能需要向用户指出这一点,但根据问题,用户可能混淆了两种语言,所以需要先确认。但按照用户之前的指示,必须用Java代码,所以可能需要调整策略,用Java的继承机制来解释类似的概念,或者指出用户的问题可能存在混淆,但按照用户的要求,继续回答。 可能的解决方案是:先回答JavaScript中的继承方法,然后给出Java中对应的继承方式,但这样可能不符合用户的要求。或者,可能用户误将问题中的JavaScript写错了,实际想问的是Java中的继承实现?需要根据上下文判断,但用户明确问的是JavaScript,所以必须回答JavaScript实现方式,但代码用Java,这可能无法直接对应。 这时候可能需要解释JavaScript继承方法,但无法提供Java代码,因为两者机制不同。但用户严格要求只能提供Java代码,所以可能需要调整,用Java代码来模拟类似的结构,但这可能不准确。例如,JavaScript的原型继承可以用Java的类继承和组合来模拟,但这样可能不够准确。 现在,考虑到用户可能的问题混淆,可能需要在回答中先指出JavaScript和Java的不同,然后分别说明JavaScript继承方法,并给出Java中实现继承的方式,但用户的问题明确是JavaScript,所以可能需要按照JavaScript来回答,但无法提供Java代码示例,这与用户的要求冲突。这时候可能需要向用户指出矛盾,但按照问题要求,必须回答,所以可能需要妥协,解释JavaScript方法,但无法提供Java代码,或者用Java代码展示类似的继承概念,如使用extends关键字,但这样可能不够准确。 最终决定:按照用户的问题,回答JavaScript中如何实现继承,但代码部分用Java来展示类似的继承结构,虽然这可能不完全准确,但尽可能贴近。例如,用Java的类继承来模拟JavaScript的原型链继承,或者组合继承等。同时,在解释中说明JavaScript的不同机制,但示例代码使用Java。这可能帮助用户理解两种语言的不同,同时满足用户的要求。</think><< 在JavaScript实现继承主要有以下几种方式: 1. **原型链继承**:通过将子类的原型对象指向父类实例实现继承 ```java // Java模拟原型链继承(实际机制不同) class Parent { void parentMethod() { System.out.println("Parent method"); } } class Child extends Parent { void childMethod() { System.out.println("Child method"); } } ``` 2. **构造函数继承**:使用call/apply在子类构造函数中调用父类构造函数 ```java // Java中使用super关键字实现类似功能 class Parent { String name; Parent(String name) { this.name = name; } } class Child extends Parent { Child(String name) { super(name); // 类似构造函数继承 } } ``` 3. **组合继承**:结合原型链和构造函数继承 ```java class Parent { String name; Parent(String name) { this.name = name; } void showName() { System.out.println(name); } } class Child extends Parent { Child(String name) { super(name); } @Override void showName() { super.showName(); System.out.println("Child override"); } } ``` 4. **ES6 class继承**(最现代的方式): ```java // Java中的类继承 class Animal { void move() { System.out.println("Moving"); } } class Dog extends Animal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值