标签: 构造函数

  • 继承

    什么是继承?

    继承一些需要重复使用的属性和方法

    原型链继承

    语法

    子构造函数.prototype = new 父构造函数()

    注:原型链继承代码必须在创建实例对象之前

    (实例对象在创建的那一刻起,其原型链就定下来了)

    //定义Person构造函数
    function Person() {}
    Person.prototype.sayHi = function () {
        console.log('hi~')
    }
    
    //定义Student构造函数
    function Student() {}
    
    //原型继承: 利用原型链, 继承于父级构造函数, 继承原型上的方法
    Student.prototype = new Person()
    //构造函数指向改回Student 否则会指向Person
    Student.prototype.constructor = Student
    let one = new Student()
    one.sayHi() //继承了Person的sayHi方法

    组合继承( 原型链 + 构造函数 )

    又称伪经典继承

    原型链主要用于实例对象继承方法构造函数用于实现实例对象属性的继承

    不足

    二次调用父类构造函数

    //定义Person构造函数
    function Person(name) {
        this.name = name
    }
    Person.prototype.sayHi = function () {
        console.log('hi~')
    }
    
    //定义Student构造函数
    function Student(name,id) {
      //第二次调用父类构造函数
      Person.call(this,name) // 实现属性的继承
         this.id = id
    }
    
    //原型继承: 利用原型链, 继承于父级构造函数, 继承原型上的方法
    //第一次调用父类构造函数
    Student.prototype = new Person()
    
    let one = new Student('Liao',1)
    one.sayHi() //继承了Person的sayHi方法

    寄生组合继承

    通过借用构造函数来继承属性,通过原型链形式来继承方法,会解决2次调用父类函

    数以及复用率的问题。

    上例中,Student实例上有name了,原型__proto__上不需要再有这些属性,利用Object.create()改造

    Object.create(参数对象), Object.create 会创建一个新对象, 并且这个新对象的__proto__ 会指向传入参数对象

    简单理解

    Object.create()通过括号内的参数对象,创建一个新的对象出来,新对象的__proto__指向参数对象

    Student.prototype = Object.create(Person.prototype)
    //效果等价于(本质还是有区别)
    Student.prototype.__proto__ = Person.prototype
    //定义Person构造函数
    ···
    //定义Student构造函数
    ···
    //利用fn.call()方法,Student已经继承了Person构造函数中的属性
    
    //原型继承
    Student.prototype = Object.create(Person.prototype)

    总结

    Object.create() 以参数的对象, 作为新建对象的__proto__属性的值, 返回新建的对象

    寄生组合式继承 – 简书

    JS 常见的 6 种继承方式_jatej的博客-CSDN博客

  • 构造函数

    使用构造函数的目的

    批量创建对象

    使用

    1. 构造函数也是函数 function
    2. 构造函数 函数名首字母需要大写(规范)
    3. 构造函数 必须和new一起使用创建对象 (批量)
    //声明函数
    function Person(nameValue) {
      this.name = nameValue
    }
    
    //创建实例对象
    // new 出来的对象称之为实例对象
    let first = new Person('Liao')
    let Second = new Person('Xin')
    

    优点

    1. 不需要手动声明对象和返回对象
    2. 有具体的类型, 类型是当前的构造函数名称(例:Person)

    注意点:必须配合new使用

    new的时候做了四件事情

    1. 创建一个新对象(在内存中开辟新空间)
    2. this指向创建的新对象
    3. 执行构造函数内代码(本质上:给新对象添加属性)
    4. 把创建的新对象给返回

    实例(对象):构造函数创建出来的对象

    拓展

    通过对象字面量批量创建

    let obj1 = {name: '小黑'}
    let obj2 = {name: '小白'}
    let obj3 = {name: '小红'}
    let obj4 = {name: '小绿'}
    
    不足

    需要创建多个有着共同属性的对象会非常麻烦

    工厂函数

    批量创建对象

    function createPerson(nameValue) {
    
    // 1.创建一个新对象
    let person = {} // 等价new Object()
    
    // 2.给对象添加对应的属性
    person.name = nameValue
    
    // 3.返回该对象
    return person
    }
    
    let third = createPerson('Shang')
    let fourth = createPerson('Li')
    
    不足
    1. 需要手动创建对象和返回这个对象
    2. 创建出来的对象类型统一是object, 无法识别对象的具体类型