美文网首页
有关js原型prototype,__proto__,constr

有关js原型prototype,__proto__,constr

作者: 雪河冰兰 | 来源:发表于2018-08-30 19:20 被阅读17次

    总结

    • 函数都有原型。
    • new P() 出来的是实例,实例没有原型,是个P类型的。
    • 而所有的原型其实类型都是对象。
    • 对象其实是个函数类型。
    • 而函数还是个函数类型。
    • 对象的原型的原型是null。

    关键点

    1. 函数即构造函数,构造函数即函数
    2. 函数都有prototype属性
    3. __proto__, prototype, constructor的关系
    4. 原型的原型是 Object.prototype
    5. Object.prototype不是任何的实例
    6. Function.prototype 是 Object 的实例
    7. Object是Function的实例
    8. Function是Function的实例
    一张图看清 构造函数、实例、Function 和 Object 的关系

    详解

    1. 函数即构造函数,构造函数即函数

    当创建了一个函数的时候,就有了这个函数的原型对象

    2. 函数都有prototype属性

    function P() {}
    var obj = {}
    
    console.log('P.__proto__', P.__proto__)
    console.log('obj.__proto__', obj.__proto__)
    
    console.log('P.prototype', P.prototype)
    console.log('obj.prototype', obj.prototype) // 没有,也就是没有原型
    

    3. __proto__, prototype, constructor的关系

    function P() {}
    let pp = new P() //pp是P的实例
    
    // __proto__
    console.log(pp.__proto__ == P.prototype) // __proto__ 是用来指定实例的原型的
    console.log(P.__proto__ == Function.prototype) // 同理P作为一个函数,它是Function的实例,与pp对P是一个意思
    
    // prototype,和constructor
    // 如上面所说,函数即构造函数有prototype属性,那么 constructor是用来指回 构造函数的(这个如果丢失了,不会影响很多,但最好不丢失)
    console.log(P.prototype.constructor == P)
    
    

    4. 原型的原型是 Object.prototype

    function P() {}
    console.log(P.prototype.__proto__ === Object.prototype)
    

    5. Object.prototype不是任何的实例

    Object.prototype.__proto__ === null
    

    6. Function.prototype 是 Object 的实例

    Function.prototype.__proto__ === Object.prototype
    

    7. Object是Function的实例

    Object.__proto__ === Function.prototype
    

    8. Function是Function的实例

    Function.__proto__ == Function.prototype
    

    9 一个案例

    
    Object.prototype.aa = 'ooooo'
    
    Function.prototype.aa = 'fffff'
    
    function P() {}
    
    var xx = new P()
    
    console.log(p.aa)  //"ooooo"
    P.__proto__ === Function.prototype //true
    P.prototype.__proto__ === Object.prototype //true
    xx.__proto__ === P.prototype //true
    xx.__proto__ === Object.prototype //false
    
    var b = {a: 1}
    
    b.__proto__ === Object.prototype //true
    

    相关文章

      网友评论

          本文标题:有关js原型prototype,__proto__,constr

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