美文网首页饥人谷技术博客
[JavaScript]之原型与原型链

[JavaScript]之原型与原型链

作者: 是苏菇凉呀 | 来源:发表于2019-05-09 23:29 被阅读3次

    一、公用属性(原型)

    所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?明显不需要。

    JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象)
    然后让每一个对象的 __proto__ 存储这个「公用属性组成的对象」的地址。

    二、函数对象

    Object 、Function 是 JS 自带的函数对象。凡是通过 new Function() 创建的对象都是函数对象。

    typeof Object     // function
    typeof Function   // function
    
    • 所有函数都是由 Function 构造出来的
    Number.__proto__ === Function.prototype  // 因为 Number 是函数,是 Function 的实例
    Object.__proto__ === Function.prototype  // 因为 Object 是函数,是 Function 的实例
    Function.__proto__ === Function.prototype  // 因为 Function 是函数,是 Function 的实例
    

    三、公式

    var 对象 = new 函数()
    对象.__proto__ === 函数.prototype
    
    所以
    
    var number = new Number()
    number.__proto__ === Number.prototype
    
    var object = new Object()
    object.__proto__ === Object.prototype
    
    var str = new String()
    str.__proto__ === String.prototype
    
    var fn = new Function()
    fn.__proto__ === Function.prototype
    

    四、__proto__prototype的区别

    __proto__是对象的属性
    prototype是函数的属性

    五、原型链

    var obj = new Object()
    obj.toString()
    

    当我们调用toString方法时,JS引擎会做下面的事情:

    1. 查看obj对象本身有没有toString属性,没有就走第二步。
    2. 查看obj.__proto__对象有没有toString属性,发现有,就找到了。
      如果
      obj.__proto__对象没有toString属性,那么会继续查看obj.__proto__.__proto__
      如果
      obj.__proto__.__proto__对象还是没有toString属性,那么再继续查看。obj.__proto__.__proto__.__proto__,直到找到toString方法或者__proto__为null(最终Boss)。
      沿着__proto__查找的路线就叫做原型链

    相关文章

      网友评论

        本文标题:[JavaScript]之原型与原型链

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