JavaScript 类继承

简介: 和其他功能一样,ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。
  1. 和其他功能一样,ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。
  2. 创建的子类将继承超类的所有属性和方法,包括构造函数及方法的实现。记住,所有属性和方法都是公用的,因此子类可直接访问这些方法。子类还可添加超类中没有的新属性和方法,也可以覆盖超类的属性和方法。
  3. 继承的方式:
  • 对象冒充方式方式一

       /*被继承类*/
    function Animal_1(name) {
        this.name = name;
        this.printName = function () {
            console.log(this.name);
        }
    }
    function Person_1(name,age) {
        this.method1 = Animal_1;
        this.method1(name);
        this.age = age;
        this.printAge = function () {
            console.log(this.age);
        }
    }
    var o1 = new Person_1("ysw",18);
    var o2 = new Animal_1("ysw");
    console.log(o1);
    console.log(o2);
    console.log(o1 instanceof Animal_1);
    console.log(o1 instanceof Person_1);
    console.log(o2 instanceof Animal_1);
    console.log(o2 instanceof Person_1);
  • 对象冒充方式方式二:利用call方法和apply方法

    function Animal_2(name) {
        this.name = name;
        this.printName = function () {
            console.log(this.name);
        }
    }
    function Person_2(name,age) {
        Animal_2.call(this,name);
        // Animal_2.apply(this,new Array(name));
        this.age = age;
        this.printAge = function () {
            console.log(this.age);
        }
    }
    o1 = new Person_2("ysw",18);
    o2 = new Animal_2("ysw");
    console.log(o1);
    console.log(o2);
    console.log(o1 instanceof Animal_2);
    console.log(o1 instanceof Person_2);
    console.log(o2 instanceof Animal_2);
    console.log(o2 instanceof Person_2);
  • 原型链方式

        /*被继承类*/
    function Animal_3() {
    }
    Animal_3.prototype.name = "ysw";
    Animal_3.prototype.printName = function () {
        console.log(this.name);
    };
    function Person_3() {
    }
    Person_3.prototype = new Animal_3();
    Person_3.prototype.age = 18;
    Person_3.prototype.printAge = function () {
        console.log(this.age);
    };
    o1 = new Person_3();
    o2 = new Animal_3();
    console.log(o1);
    console.log(o2);
    console.log(o1 instanceof Animal_3);
    console.log(o1 instanceof Person_3);
    console.log(o2 instanceof Animal_3);
    console.log(o2 instanceof Person_3);
  • 混合方式:结合对象冒充方式和原型链方式的优点,是ES6之前最常用的继承方式

        /*被继承类*/
    function Animal_4(name) {
        this.name = name;
    }
    Animal_4.prototype.printName = function () {
        console.log(this.name);
    };
    function Person_4(name,age) {
        Animal_4.call(this,name);
        this.age = age;
    }
    Person_4.prototype = new Animal_4();
    Person_4.prototype.printAge = function () {
        console.log(this.age);
    };
    o1 = new Person_4("晏沈威",22);
    o2 = new Animal_4("晏沈威");
    console.log(o1);
    console.log(o2);
    console.log(o1 instanceof Animal_4);
    console.log(o1 instanceof Person_4);
    console.log(o2 instanceof Animal_4);
    console.log(o2 instanceof Person_4);
  • ES6语法 class extends继承

        /*被继承类*/
    class Animal_5 {
        constructor(name){
            this.name = name;
        }
        printName(){
            console.log(this.name);
        }
    }
    class Person_5 extends Animal_5{
        constructor(name,age){
            super(name);
            this.age = age;
        }
        printAge() {
            console.log(this.age);
        };
    }
    o1 = new Person_5("晏沈威",22);
    o2 = new Animal_5("晏沈威");
    console.log(o1);
    console.log(o2);
    console.log(o1 instanceof Animal_5);
    console.log(o1 instanceof Person_5);
    console.log(o2 instanceof Animal_5);
    console.log(o2 instanceof Person_5);
目录
相关文章
|
15天前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承通过原型链实现共享,节省内存,但不支持私有属性。
19 0
|
15天前
|
JavaScript 前端开发
JavaScript 继承的方式和优缺点
JavaScript 继承的方式和优缺点
15 0
|
15天前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(三)
深入JS面向对象(原型-继承)
32 0
|
15天前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
34 0
|
15天前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
23 2
|
15天前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
22 0
|
12天前
|
前端开发 JavaScript
前端 js 经典:class 类
前端 js 经典:class 类
8 2
|
14天前
|
JavaScript 前端开发
JavaScript 原型链继承:掌握面向对象的基础
JavaScript 原型链继承:掌握面向对象的基础
|
15天前
|
JavaScript 前端开发
JavaScript 中最常用的继承方式
【5月更文挑战第9天】JavaScript中的继承有多种实现方式:1) 原型链继承利用原型查找,但属性共享可能引发问题;2) 借用构造函数避免共享,但方法复用不佳;3) 组合继承结合两者优点,是最常用的方式;4) ES6的class继承,是语法糖,仍基于原型链,提供更直观的面向对象编程体验。
26 1
|
15天前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念
【5月更文挑战第9天】JavaScript继承有优点和缺点。优点包括代码复用、扩展性和层次结构清晰。缺点涉及深继承导致的复杂性、紧耦合、单一继承限制、隐藏父类方法以及可能的性能问题。在使用时需谨慎,并考虑其他设计模式。
18 2