标签: 原型

  • 原型链

    是什么

    对象 有 __proto__ 属性,指向原型对象,原型对象也是对象,也有__proto__属性,指向原型对象的原型对象,这样形成的一环一环的链式结构,就是原型链。

    老祖宗 function Object()

    function Person() {}
    
    let per = new Person()
    
    //原型链:
    per.__proto__ ==> Person.prototype
    
    Person.prototype.__proto__ ==> Object.prototype
    
    Object.prototype.__proto__ ==> null
    

    属性查找原则

    简单理解:沿着对象的原型链来查找

    1. 先找对象自身,自身有就直接来使用
    2. 对象自身没有,就找原型对象
    3. 如果原型对象也没有,就沿着原型链继续往上找,直到Object.prototype
    4. 如果整个链上都没有,返回undefined
  • __proto__隐式原型

    是什么

    对象的一个属性

    有什么用

    对象可以通过__proto__访问到构造函数的原型对象

    当一个实例访问属性时, 在自己身上没有找到时, 会自动根据 __proto__ 找到原型对象, 去找原型对象上的属性···(拓展:原型链)

    function Person() {}
    
    let per = new Person()
    
    per.__proto__ === Person.prototype
    

    总结

    对象的__proto__ 等价于 构造函数的prototype属性

  • 原型prototype

    1. 函数本质上也是对象, 所以函数也有属性
    2. 函数有prototype属性:属性值是个对象,叫做原型(对象)
    3. prototype属性的作用:通过构造函数创建出来的实例对象可以直接去访问这个原型对象上的任意属性和方法

    prototype 是函数特有的属性, 只有函数能使用

    是什么

    函数的一个属性,值是一个对象,我们也称为 prototype 的值为原型(对象)

    有什么作用

    共享方法

    使用目的

    解决内存浪费问题

    使用构造函数批量创建对象,多个对象有共同方法时会产生内存浪费问题

    我们可以把重复的一样的方法,添加到原型对象中,这样所有通过该构造函数创建的实例对象,都可以共享此方法。

    //声明函数
    function Person() {}
    
    //给原型对象添加属性和方法
    Person.prototype.gender = '男'
    
    Person.prototype.doSomething = function(){
      console.log('干啥呢')
    }
    
    //创建实例对象
    let first = new Person()
    
    //实例对象调用原型对象中的属性和方法
    first.gender //男
    first.doSomething() //干啥呢
    

    总结

    在原型对象上添加方法, 让所有实例对象共享, 可以保证内存的不浪费

    1. 对象的属性一般写在构造函数中,属性添加给了实例对象自身
    2. 对象的方法写在原型对象中,方便让所有实例对象共享

    constructor属性

    1. 原型对象自带的属性
    2. 该属性值指向了当前的构造函数

    是什么

    原型对象里的一个属性, 指向了构造函数方法

    function Person () {}
    
    let first = new Person()
    
    Person.prototype === Person
    
    first.__proto__.constructor === Person

    实例对象本身没有constructor属性,实例对象可以直接访问原型对象的属性。