美文网首页
JS原型与原型链(三)

JS原型与原型链(三)

作者: XiaoAM | 来源:发表于2019-11-15 18:34 被阅读0次

    七. 函数对象 (复习一下前面的知识点)

    所有函数对象的proto都指向Function.prototype,它是一个空函数(Empty function)

    Number.__proto__ === Function.prototype  // true
    Number.constructor == Function //true
    
    Boolean.__proto__ === Function.prototype // true
    Boolean.constructor == Function //true
    
    String.__proto__ === Function.prototype  // true
    String.constructor == Function //true
    
    // 所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身
    Object.__proto__ === Function.prototype  // true
    Object.constructor == Function // true
    
    // 所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身
    Function.__proto__ === Function.prototype // true
    Function.constructor == Function //true
    
    Array.__proto__ === Function.prototype   // true
    Array.constructor == Function //true
    
    RegExp.__proto__ === Function.prototype  // true
    RegExp.constructor == Function //true
    
    Error.__proto__ === Function.prototype   // true
    Error.constructor == Function //true
    
    Date.__proto__ === Function.prototype    // true
    Date.constructor == Function //true
    

    JavaScript中有内置(build-in)构造器/对象共计12个(ES5中新加了JSON),这里列举了可访问的8个构造器。剩下如Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math,JSON是以对象形式存在的,无需new。它们的proto是Object.prototype。如下

    
    Math.__proto__ === Object.prototype  // true
    Math.construrctor == Object // true
    
    JSON.__proto__ === Object.prototype  // true
    JSON.construrctor == Object //true
    

    上面说的函数对象当然包括自定义的。如下

    
    // 函数声明
    function Person() {}
    // 函数表达式
    var Perosn = function() {}
    console.log(Person.__proto__ === Function.prototype) // true
    console.log(Man.__proto__ === Function.prototype)    // true
    

    这说明什么呢?

    ** 所有的构造器都来自于 Function.prototype,甚至包括根构造器Object及Function自身。所有构造器都继承了·Function.prototype·的属性及方法。如length、call、apply、bind**

    (你应该明白第一句话,第二句话我们下一节继续说,先挖个坑:))
    Function.prototype也是唯一一个typeof XXX.prototype为 function的prototype。其它的构造器的prototype都是一个对象(原因第三节里已经解释过了)。如下(又复习了一遍):

    console.log(typeof Function.prototype) // function
    console.log(typeof Object.prototype)   // object
    console.log(typeof Number.prototype)   // object
    console.log(typeof Boolean.prototype)  // object
    console.log(typeof String.prototype)   // object
    console.log(typeof Array.prototype)    // object
    console.log(typeof RegExp.prototype)   // object
    console.log(typeof Error.prototype)    // object
    console.log(typeof Date.prototype)     // object
    console.log(typeof Object.prototype)   // object
    

    噢,上面还提到它是一个空的函数,console.log(Function.prototype) 下看看(留意,下一节会再说一下这个)

    知道了所有构造器(含内置及自定义)的proto都是Function.prototype,那Function.prototype的proto是谁呢?
    相信都听说过JavaScript中函数也是一等公民,那从哪能体现呢?如下
    console.log(Function.prototype.proto === Object.prototype) // true
    这说明所有的构造器也都是一个普通 JS 对象,可以给构造器添加/删除属性等。同时它也继承了Object.prototype上的所有方法:toString、valueOf、hasOwnProperty等。(你也应该明白第一句话,第二句话我们下一节继续说,不用挖坑了,还是刚才那个坑;))

    最后Object.prototype的proto是谁?

    Object.prototype.__proto__ === null // true
    

    已经到顶了,为null。

    八. Prototype

    在 ECMAScript 核心所定义的全部属性中,最耐人寻味的就要数 prototype 属性了。对于 ECMAScript 中的引用类型而言,prototype 是保存着它们所有实例方法的真正所在。换句话所说,诸如 toString()和 valuseOf() 等方法实际上都保存在 prototype 名下,只不过是通过各自对象的实例访问罢了。

    ——《JavaScript 高级程序设计》第三版 P116

    相关文章

      网友评论

          本文标题:JS原型与原型链(三)

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