• 技术文章 >web前端 >js教程

    一文带你搞懂JavaScript中的原型和原型链

    青灯夜游青灯夜游2022-01-04 10:33:26转载218
    原型和原型链是JavaScript中的难点也是重点,下面本篇文章就来带大家搞懂原型和原型链,希望对大家有所帮助!

    如果你对原型和原型链的了解还停留在一个很浅的、模棱两可的阶段,不妨来看看我的这篇文章,它应该能对你能有所帮助,如果对你有那么一丢丢帮助的话,欢迎点赞评论加转发。有问题和疑惑的话也可以在评论区留言,我会第一时间回复大家,如果觉得我的文章哪里有知识点错误的话,也恳请能够告知,把错的东西理解成对的,对我们这个行业来说,是致命的。

    之前虽然也经常刷原型方面的面试题,但是总是停留在一个很浅的、对知识点模棱两可的阶段,而且经常忘记(这点相信大伙也是这样,哈哈哈),趁着元旦假期的最后一天(终于摸起了键盘),跟着b站一个视频过了下相关方面的知识,对此终于有了一个整体的理解。这里对其进行了一个整理和归纳。

    呜呜呜,本猿在这里立誓,未来一周,不管多忙,都需要回顾一遍本文,
    否则
    否则
    掘金永远抽bug。

    先知道对应关系

    prototype:原型
    __proto__:原型链(链接点)

    大家经常忽略忘记的一点:Object是个方法(构造函数),new Object是个实例对象!!!

    console.log(Object) //typeof Object ==='function'
    console.log(new Object) //typeof new Object ==='object'

    constructor

    constructor就是实例化对象的构造函数

    //test.constructor -> 实例化test对象的构造函数 Test
    console.log(test.constructor===Test) //true
    
    //这里个人理解为永无止境的自身调用自身,求解,没找到相关文章。
    console.log(test.constructor.prototype.constructor===Test) //true
    console.log(test.constructor.prototype.constructor.prototype.constructor===Test) //true
    //constructor允许更改
    function Test2() {
        this.a=123
    }
    test.constructor=Test2
    console.log(test)

    原型

    function Test(){}
    let test=new Test() //new完之后 test是个实例对象了
    console.log(test.__proto__===Test.prototype) //根据上面的对应关系表 可以知道结果为true
    //Test.prototype也是一个对象,所以他必须也得有__proto__
    //Test.prototype.__proto__已经到达终点了,终点是什么,终点就是Object构造函数,所以下面结果为ture
    console.log(Test.prototype.__proto__.constructor===Object)
    //且 按照上面对应关系中的规则和上条的结果,下条结果也是ture
    console.log(Test.prototype.__proto__===Object.prototype) // 
    //终点为null
    console.log(Object.prototype.__proto__) //null

    1.png

    能不能描述一下原型链

    对象的__proto__保存着对象的构造函数的prototypeprototype又是个对象,所以也有自己的__proto__,这样往复到终点Object.__proto__,这样就形成了一个以__proto__为链接点(为key)值为构造方法的prototype对象的一根链条, 即为原型链。

    //__proto__
    test{
          b:333,
          a:1,
          __proto__:Test.prototype={
              c:222,
              b:2,
              __proto__:Object.prototype={
                  c:3,
                  __proto__:null
              }
          }
     }

    2.png

    特殊的函数对象

    重点:JS中,函数是一种特殊的对象!!!

    记住文章开头的对应关系表

    //函数是特殊对象 所以__proto__是存在的,且是个function
    console.log(Test.__proto__) //function
    console.log(Test.prototype) //object

    Test既然是个函数,那么底层必然也是new Function实现的,那么

    //对象的__proto__保存着对象的构造函数的prototype
    console.log(Test.__proto__===Function.prototype) //true 这里是不是和关系表对应上了,能正常理解
    
    const obj={}
    const obj2=new Object()
    
    console.log(Object) //function
    console.log(typeof Object) //'function'

    Function既然是个构造函数,那么他是不是也应该有__proto__prototype,是的,但是这里有一个特殊的点需要记住。

    底层规则规定 :Function.__proto__===Function.prototype是相等的,且两者返回的都是一个function,我的理解是Function自己构造了自己。

    //正常来说函数的Test.prototype应该是个object,
    //Function.prototype是个function,这也是一个特殊的点
    typeof Test.prototype==='object' //true
    
    console.log(Function.__proto__) // 一个function
    console.log(Function.prototype) // 一个function
    //Function既然是函数对象_,那么他的_proto__就指向他的构造函数的prototype,也就是
    //Function.__proto__===Function.prototype,自己调自己,这样理解是不是也没毛病。
    console.log(Function.__proto__===Function.prototype) //true
    
    //Object既然是个构造方法,那么底层也是new Function
    console.log(Object.__proto__===Function.prototype) //true
    
    // 因为Function.__proto__===Function.prototype 所以下面代码是成立的
    (Object.__proto__===Function.__proto__)===true

    hasOwnProperty和in

    hasOwnProperty

    hasOwnProperty用来判断是否是对象自身的属性(非原型链继承过来的)

    let test={
        a:1,
        b:2
    }
    Object.prototype.c=3
    console.log(test.hasOwnProperty('a')) //true
    console.log(test.hasOwnProperty('b')) //true
    console.log(test.hasOwnProperty('c')) //false

    in

    in用来检查对象是是否包含某个属性(包含原型链上的属性)

    console.log('a' in test) //true
    console.log('b' in test) //true
    console.log('c' in test) //true
    console.log('toString' in test) //true
    console.log('d' in test) //false

    【相关推荐:javascript学习教程

    以上就是一文带你搞懂JavaScript中的原型和原型链的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:JavaScript 原型 原型链
    上一篇:一文深入了解 Node 中的事件循环 下一篇:一文带你了解Node.js中的eventloop
    PHP编程就业班

    相关文章推荐

    • JavaScript中wrap的意思是什么• 深入聊聊JavaScript中的JSON模块• javascript中search()怎么用• 详细解析JavaScript中的六大基本数据类型• 分享给你14个JavaScript数据可视化库

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网