美文网首页
js对象中 _proto_ 和 prototype 区别

js对象中 _proto_ 和 prototype 区别

作者: Joazer | 来源:发表于2018-03-06 09:41 被阅读0次

    _proto_:

    所有构造器/函数的proto都指向Function.prototype,它是一个空函数(Empty function)

    Number.__proto__ === Function.prototype  // true
    Boolean.__proto__ === Function.prototype // true
    String.__proto__ === Function.prototype  // true
    Object.__proto__ === Function.prototype  // true
    Function.__proto__ === Function.prototype // true
    Array.__proto__ === Function.prototype   // true
    RegExp.__proto__ === Function.prototype  // true
    Error.__proto__ === Function.prototype   // true
    Date.__proto__ === Function.prototype    // true
    

    Function本身就是函数,Function.proto是标准的内置对象Function.prototype。

    console.log(typeof Function.prototype) // function
    

    Function.prototype.proto是标准的内置对象Object.prototype。

    console.log(Function.prototype.__proto__ === Object.prototype) // true
    

    Object.prototype是原型链的顶端,所有对象从它继承了包括toString等等方法和属性。

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

    对象的__proto__指向自己构造函数的prototype。obj.__proto__.__proto__...的原型链由此产生,包括我们的操作符instanceof正是通过探测
    obj.__proto__.__proto__... === Constructor.prototype
    来验证obj是否是Constructor的实例

    prototype:

    只有函数才有prototype属性.

    当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。

    image

    Function.prototype和Function.proto都指向Function.prototype,这就是鸡和蛋的问题怎么出现的。

    Object.prototype.proto === null,说明原型链到Object.prototype终止。

    Object本身是构造函数,继承了Function.prototype;Function也是对象,继承了Object.prototype。这里就有一个鸡和蛋的问题:

    Object instanceof Function // true
    Function instanceof Object // true
    

    参考:

    proto和prototype来深入理解JS对象和原型链

    JavaScript中proto与prototype的关系

    注意一点,this这个值在一个继承机制中(原型链与),仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。

    相关文章

      网友评论

          本文标题:js对象中 _proto_ 和 prototype 区别

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