美文网首页
js 面向对象 实现继承的几种方式

js 面向对象 实现继承的几种方式

作者: 一只章鱼哥 | 来源:发表于2021-01-08 13:04 被阅读0次

1.原型链继承

1.1 原理:将父类的实例添加到子类的原型上

1.2 缺点:父类新增原型方法/原型属性,子类都可以访问到,父类一变子类都会改变

function Person (name) {
            this.name = name;
        };
        Person.prototype.getName = function () {    //对原型进行扩展
            return this.name;
        };
        function Parent (age) {
            this.age = age;
        };
        Parent.prototype = new Person('老明');
        Parent.prototype.getAge = function () {
            return this.age;
        };
        var result = new Parent(22);

2.构造继承

2.1 原理:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

2.2 缺点:方法都在构造函数中定义, 只能继承父类的实例属性和方法,不能继承原型属性/方法,无法实现函数复用,每个子类都有父类实例函数的副本,影响性能

function Person (name) {
            this.name = name;
            this.friends = ['小李','小红'];
            this.getName = function () {
                return this.name;
            }
        };

//        Person.prototype.geSex = function () {    //对原型进行扩展的方法就无法复用了
//            console.log("男");
//        };

        function Parent = (age) {
            Person.call(this,'老明');  //这一句是核心关键
            //这样就会在新parent对象上执行Person构造函数中定义的所有对象初始化代码,
            // 结果parent的每个实例都会具有自己的friends属性的副本
            this.age = age;
        };

        var result = new Parent(23);
        console.log(result.name);    //老明
        console.log(result.friends);  //["小李", "小红"]     console.log(result.getName());  //老明     console.log(result.age);    //23     console.log(result.getSex());  //这个会报错,调用不到父原型上面扩展的方法

           

           

3.组合继承

所有的实例都能拥有自己的属性,并且可以使用相同的方法,组合继承避免了原型链和借用构造函数的缺陷,结合了两个的优点,是最常用的继承方式

3.1.原理:通过调用父类构造,继承父类的属性并保留传参的优点,再通过将父类实例作为子类原型,实现函数复用

        function Person  (name) {

            this.name = name;

            this.friends = ['小李','小红'];

        };

        Person.prototype.getName = function () {

            return this.name;

        };

        function Parent (age) {

            Person.call(this,'老明');  //这一步很关键

            this.age = age;

        };

        Parent.prototype = new Person('老明')  //这一步也很关键

4.寄生组合继承

4.1 原理: 通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免了组合继承的缺点

function Person(name) {
            this.name = name;
            this.friends = ['aa','bb'];
        }

        Person.prototype.getName = function () {
            return this.name;
        };

        function Parent(age) {
            Person.call(this,"cc");
            this.age = age;
        }

        (function () {
            var Super = function () {};    // 创建一个没有实例方法的类
            Super.prototype = Person.prototype;
            Parent.prototype = new Super();    //将实例作为子类的原型
        })();
        var result = new Parent(23);

相关文章

  • js 面向对象 实现继承的几种方式

    1.原型链继承 1.1 原理:将父类的实例添加到子类的原型上 1.2 缺点:父类新增原型方法/原型属性,子类都可以...

  • JavaScript 继承

    继承是JS中非常内容,原因就是JS没有地道的继承方式,我们只能通过各种方式来模拟面向对象中的继承。下面介绍几种常见...

  • javascript中如何使用面向对象实现继承?

    javascript 面向对象(实现继承的几种方式)[https://www.cnblogs.com/chaixi...

  • JS继承的实现的几种方式

    前言 JS作为面向对象的弱类型语言,继承也是非常强大的特性之一,那么如何在JS实现继承呢? JS继承的实现方式 既...

  • JavaScript常见的继承方式

    前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么在JS中常见的继承方式有几种呢? 方式一、原...

  • js中的继承-原型与原型链

    面向对象的语言支持两种继承方式,接口继承和实现继承js无法实现接口继承,只支持实现继承,主要通过原型链来实现。具体...

  • js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法。

  • 对象的继承

    JS 作为面向对象的弱类型的语言,继承是它非常强大的特征之一 JS继承实现的方式: 1.原型链继承2.构造函数继承...

  • 面向对象五

    面向对象高级二 总结 PHP 里的面向对象、继承方式 JS 里的继承方式 call(构造函数伪装) 和 proto...

  • 学习总结目录

    javascript基础 js数据类型面向对象继承js的this指向自己实现call,apply,bindjs事件...

网友评论

      本文标题:js 面向对象 实现继承的几种方式

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