继承

作者: 雨泽丶 | 来源:发表于2019-04-24 21:41 被阅读0次

1. 构造函数继承

 问题:原型上的方法或者属性,无法继承
    function Fn() {
        this.name = "zhangsan",
        this.age = 12
        this.eat = function () {
        console.log("eat")
        }
    }
    Fn.prototype.sleep = function () {
        console.log("sleep")
    } // 无法继承
    function F() {
        // console.log(this)
        // Array.prototype.join.call(obj,'-') / Array.prototype.join.apply(obj,['-'])
        Fn.call(this)
    }
        var fn = new Fn()
        console.log(fn)
        var f = new F()
        console.log(f.sleep())

重点:用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))

特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性。

2、解决了原型链继承缺点1、2、3。

3、可以继承多个构造函数属性(call多个)。

4、在子实例中可向父实例传参。

缺点:1、只能继承父类构造函数的属性。

2、无法实现构造函数的复用。(每次用每次都要重新调用)

3、每个新实例都有父类构造函数的副本,臃肿。

2、 原型继承

  问题: 共用一个原型对象,导致谁修改原型对象的值,其余对象都会被更改
    function Fn() {
        this.name = "zhangsan"
        this.age = 12
        this.color = ["yellow", "pink"]
        this.eat = function () {
            console.log("eat")
        }
    }
    Fn.prototype.sleep = function () {
        console.log("sleep")
    }
    function F() {
    }
    F.prototype = new Fn()
    var f = new F()
    var f1 = new F()
    f.color.push("black")

    console.log(f1.color)

重点:让新实例的原型等于父类的实例。

特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)

缺点:1、新实例无法向父类构造函数传参。

2、继承单一。

3、所有新实例都会共享父类实例的属性。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)

3、组合方式继承:

function Fn() {
    this.name = "zhangsan"
    this.age = 12
    this.color = ["yellow", "pink"]
    this.eat = function () {
        console.log("eat")
        }
    }
    function F() {
        Fn.call(this)
    }
    F.prototype = Object.create(Fn.prototype)
    // F.prototype = Fn.prototype.constructor === Fn
    F.prototype.constructor = F

    var f = new F()
    var f1 = new F()
    f.color.push("black")
    console.log(f1.color)

    function FCC() { }
    //instanceof 用来
    console.log(f instanceof FCC) //true
    console.log(f instanceof Fn)    //true
    console.log(typeof 1)       //numeber

重点:结合了两种模式的优点,传参和复用

特点:1、可以继承父类原型上的属性,可以传参,可复用。

2、每个新实例引入的构造函数属性是私有的。

缺点:调用了两次父类构造函数(耗内存),子类的构造函数会代替原型上的那个父类构造函数。

  • instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构建函数的原型对象(prototype),是否在左边对象的原型链上。因此,上面两种写法是等价的。
  • instanceof运算符只能用于对象,不适用原始类型的值。

相关文章

  • 继承 继承

    属性拷贝 继承不单单能通过原型链实现,也能通过其他方式实现,属性拷贝就是其中一种方法。 通过属性拷贝也能实现继承子...

  • 继承(单继承,多继承)

    将共性的内容放在父类中,子类只需要关注自己特有的内容 python中所有的内容都是对象,所有的对象都直接或间接继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • 原型相关(二)

    1.继承 继承方式:接口继承(只继承方法签名)实现继承(继承实际的方法)ECMAScript只支持实现继承,并且主...

  • 继承

    继承的引入和概述 继承案例和继承的好处 继承的弊端 Java中继承的特点 继承的注意实现和什么时候使用继承 继承中...

  • Java面向对象三大特性之继承

    继承 一、继承的特点 Java只支持单继承单继承 多继承 单继承、多继承优缺点①单继承优点:提高了代码的复用性,让...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • 【重学前端】JavaScript中的继承

    JavaScript中继承主要分为六种:类式继承(原型链继承)、构造函数继承、组合继承、原型式继承、寄生式继承、寄...

  • js之继承

    文章主讲 JS 继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承、原型式继承、 ES6 继承,以及 多继...

网友评论

      本文标题:继承

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