美文网首页让前端飞前端开发
web前端:谈谈js中实现类的创建和继承

web前端:谈谈js中实现类的创建和继承

作者: 长肉肉呱 | 来源:发表于2019-05-05 23:15 被阅读8次

我们都知道,Javascript中是没有"类"这个概念的。但是在诸多环境中,有时又需要我们手动去实现类似java中的类和继承。下面我们来探索一下,如何才能完美实现js中的类和继承。

创建类

我们可以很简单的通过构造函数来实现一个类

// 创建类
        function Animal(name, sex) {
            this.name = name;
            this.sex = sex;
        }

        Animal.prototype.say = function() {
            console.log('i m animal');
        }

可以直接new出实现这个类的对象。

// 创建对象
        var cat = new Animal('cat', 'man');
        console.log(cat.name)
        console.log(cat.sex)
        console.log(cat.say())

实现继承

下面我们来谈谈js中类的继承。

  • 原型链继承
    第一种方式就是我们经常听到的原型链继承。
        function Cat(name, sex) {
            Animal.call(this, name, sex);
        }

        Cat.prototype = new Animal;
        var maoxian = new Cat('maoxian', 'nv');
        maoxian.say();
        console.log(cat.name)
        console.log(cat.sex)
        console.log(cat.say())

介绍:在这里我们可以看到new了一个空对象,这个空对象指向Animal并且Cat.prototype指向了这个空对象,这种就是基于原型链的继承。
特点:基于原型链,既是父类的实例,也是子类的实例
缺点:无法实现多态继承

  • 构造继承
        function Cat(name) {
            Animal.call(this)
        }
        var maoxian = new Cat('maoxian');
        console.log(maoxian.name);
        console.log(maoxian.sex);
        maoxian.say()

特点:可以实现多继承
缺点:只能继承父类实例的属性和方法,不能继承原型上的属性和方法。

  • 组合继承
        function Cat(name){
        Animal.call(this);
        this.name = name || 'Tom';
        }
        Cat.prototype = new Animal();
        Cat.prototype.constructor = Cat;
        // Test Code
        var cat = new Cat();
        console.log(cat.name);
        console.log(cat.sleep());
        console.log(cat instanceof Animal); // true
        console.log(cat instanceof Cat); // true

特点:可以继承实例属性/方法,也可以继承原型属性/方法
缺点:调用了两次父类构造函数,生成了两份实例

  • 寄生组合式继承
    上面的组合继承
    借用构造函数实现了继承独享属性和方法
    借用原型链继承实现了继承原型链上的属性和方法
    但是仔细会发现调用了两次类构造函数。
    寄生继承就是不用实例化父类了,直接实例化一个临时副本实现了相同的原型链继承。(即子类的原型指向父类副本的实例从而实现原型共享)
    其实感觉意义不大。。。😓
        function Cat(name){
        Animal.call(this);
        this.name = name || 'Tom';
        }
        (function(){
        // 创建一个没有实例方法的类
        var Super = function(){};
        Super.prototype = Animal.prototype;
        //将实例作为子类的原型
        Cat.prototype = new Super();
        })();
        // Test Code
        var cat = new Cat();
        console.log(cat.name);
        console.log(cat.sleep());
        console.log(cat instanceof Animal); // true
        console.log(cat instanceof Cat); //true

其实类和继承在实战中用的很少,js毕竟不是基于类的语言,只是面试中有时会问到。有帮助的话给点个赞呗~~

相关文章

  • web前端:谈谈js中实现类的创建和继承

    我们都知道,Javascript中是没有"类"这个概念的。但是在诸多环境中,有时又需要我们手动去实现类似java中...

  • JS继承

    JS中的继承 许多OO语言都支持两种继承方式:接口继承和实现继承; 因为JS中没有类和接口的概念 , 所以JS不支...

  • 17.继承内置类和js中的多态

    1.继承内置类 定义类的时候,如果没有实现继承,默认继承自Object类 相当于下面 3.js中的多态 面向对象的...

  • Web前端------JS高级继承的实现方式

    原型实现继承 借用构造函数实现继承 组合继承 拷贝继承 继承总结 浅拷贝 深拷贝 欢迎关注我的个人微信公众号,免费...

  • 线程

    如何创建和使用线程 继承 Thread 类。 实现 Runnable 接口。 使用 Callable 和 Futu...

  • JS继承

    JS继承的几种实现方式 继承是指子类继承父类的属性和方法,要实现继承,首先我们需要有一个父类 原型链继承 原型链继...

  • 多线程

    一.线程的创建和使用: 1.继承于Thread类: 2.实现Runnable接口: 3.实现Callable接口:...

  • JavaScript 10

    js继承的概念 1.通过原型链方式实现继承(对象间的继承) 2.类式继承(构造函数间的继承) 由于js不像Java...

  • web前端-js继承的理解

    什么是继承 js中的继承就是获取存在对象已有属性和方法的一种方式. 继承一 属性拷贝 就是将对象的成员复制一份给需...

  • es6 class进阶【一个将class转原型对象的例子】

    背景 class的出现,让js开发者告别了使用原型对象模仿面向对象中的类和类继承时代。在前端开发中,使用到clas...

网友评论

    本文标题:web前端:谈谈js中实现类的创建和继承

    本文链接:https://www.haomeiwen.com/subject/hpnkoqtx.html