资讯专栏INFORMATION COLUMN

Node.js中的继承

fxp / 2432人阅读

摘要:借用构造函数借助或使用构造函数缺少函数复用原型链继承使用指向对象子类无法给父类传递参数无法使用字面量添加新方法所有子类对象共享父类所有方法和属性引用类型组合继承借用构造函数对实例属性继承对共享方法继承会调用两次父类构造函数继承

借用构造函数,借助call或apply,使用Superclass构造函数,缺少函数复用

function Superclass(name = "default") {
        this.name = name;
    }
    
    function Subclass(age = 22, name) {
        this.age = age;
        Superclass.call(this, name);
        this.say = function () {
            console.log(`this.name=${this.name}...this.age=${this.age}`);
        };
    }
    
    const test = new Subclass(23);
    test.say();
    console.log(`test instanceof Subclass`, test instanceof Subclass);
    console.log(`test instanceof Superclass`, test instanceof Superclass);
    console.log(test.__proto__.constructor);
    console.log(Subclass.prototype.constructor);

原型链继承,使用prototype指向Superclass对象,子类无法给父类传递参数,无法使用字面量添加新方法,所有子类对象共享父类所有方法和属性(引用类型)

    function Superclass(name = "default") {
        this.name   = name;
        this.colors = ["r", "y"];
    }

    function Subclass(age = 22) {
        this.age = age;
        this.say = function () {
            console.log(`this.name=${this.name}...this.age=${this.age}`);
        };
    }

    Subclass.prototype             = new Superclass();
    Subclass.prototype.constructor = Subclass;

    const test  = new Subclass(23);
    const test1 = new Subclass(24);
    test.colors.push("b");
    console.log(test.colors);
    console.log(test1.colors);
    test.say();
    test1.say();
    console.log(`test instanceof Subclass`, test instanceof Subclass);
    console.log(`test instanceof Superclass`, test instanceof Superclass);
    console.log(test.__proto__.constructor);
    console.log(Subclass.prototype.constructor);

组合继承,prototype+call/apply,借用构造函数对实例属性继承,prototype对共享方法继承,会调用两次父类构造函数

    function Superclass(name = "default") {
        this.name = name;
    }

    Superclass.prototype.say = function () {
        console.log(this.name);
    };

    function Subclass(age = 22, name) {
        this.age = age;
        Superclass.call(name);
    }

    Subclass.prototype             = new Superclass();
    Subclass.prototype.constructor = Subclass;

    const test = new Subclass(23);
    test.say();
    console.log(`test instanceof Subclass`, test instanceof Subclass);
    console.log(`test instanceof Superclass`, test instanceof Superclass);
    console.log(test.__proto__.constructor);
    console.log(Subclass.prototype.constructor);

ES6 Class继承

    class Superclass {
        constructor(name = "default") {
            this.name = name;
        }
    }
    class Subclass extends Superclass {
        constructor(age = 22, name) {
            super(name);
            this.age = age;
        }

        say() {
            console.log(`this.name=${this.name}...this.age=${this.age}`);
        }
    }

    const test = new Subclass(23);
    test.say();
    console.log(`test instanceof Subclass`, test instanceof Subclass);
    console.log(`test instanceof Superclass`, test instanceof Superclass);
    console.log(test.__proto__.constructor);
    console.log(Subclass.prototype.constructor);

Node util.inherits;

    function Superclass(name = "default") {
        this.name = name;
    }

    function Subclass(age = 22, name) {
        this.age = 22;
        Superclass.call(this, name);

        this.say = function () {
            console.log(`this.name=${this.name}...this.age=${this.age}`);
        };

    }

    require("util").inherits(Subclass, Superclass);

    const test = new Subclass(23);
    test.say();
    console.log(`test instanceof Subclass`, test instanceof Subclass);
    console.log(`test instanceof Superclass`, test instanceof Superclass);
    console.log(test.__proto__.constructor);
    console.log(Subclass.prototype.constructor);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81456.html

相关文章

  • Node.js 中 Java类的定义,set、get方法,类的实例化,继承的实现,方法重写:学习心得

    摘要:一实体类的定义定义类有参构造方法二定义方法以设置实体类的属性值方法三定义方法以获取实体类的属性值方法四构造实例对象使用全参构造方法获取实例对象桐人男控制台打印实例 一、Node.js 实体类 的定义 //定义类Person 有参构造方法 function Person(name, sex, age, addr, salary) { this.name = name; t...

    fjcgreat 评论0 收藏0
  • Node.js 开发指南 读书笔记

    摘要:为指定事件注册一个监听器,接受一个字符串和一个回调函数。发射事件,传递若干可选参数到事件监听器的参数表。为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。 1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色; js 异步 io 与事件驱动给服务器带来极高...

    CocoaChina 评论0 收藏0
  • 前端文档收集

    摘要:系列种优化页面加载速度的方法随笔分类中个最重要的技术点常用整理网页性能管理详解离线缓存简介系列编写高性能有趣的原生数组函数数据访问性能优化方案实现的大排序算法一怪对象常用方法函数收集数组的操作面向对象和原型继承中关键词的优雅解释浅谈系列 H5系列 10种优化页面加载速度的方法 随笔分类 - HTML5 HTML5中40个最重要的技术点 常用meta整理 网页性能管理详解 HTML5 ...

    jsbintask 评论0 收藏0
  • 前端文档收集

    摘要:系列种优化页面加载速度的方法随笔分类中个最重要的技术点常用整理网页性能管理详解离线缓存简介系列编写高性能有趣的原生数组函数数据访问性能优化方案实现的大排序算法一怪对象常用方法函数收集数组的操作面向对象和原型继承中关键词的优雅解释浅谈系列 H5系列 10种优化页面加载速度的方法 随笔分类 - HTML5 HTML5中40个最重要的技术点 常用meta整理 网页性能管理详解 HTML5 ...

    muddyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<