zoukankan      html  css  js  c++  java
  • 关于javascript中原型和原型链的理解

      对于js中的原型以及原型链,笔者一直觉得有些迷惑,对于其中的概念是大致理解的,但是如果让笔者说出来就感觉比较难以清晰的表达出来,所以就在这里做一下总结,有疑问的时候再翻出来回顾一下

      首先,我们看一段代码

     function Person() {
    
     }
    
     var person = new Person();
    
     console.log(person);
     console.log(Person);
     console.log(Object)
    
     console.log(person.prototype);
     console.log(Person.prototype);
     console.log(Object.prototype);
    
     console.log(person.constructor);
     console.log(Person.constructor);
     console.log(Object.constructor);
    
     console.log(person.__proto__);//注意此处前后各是两个下划线,以下同理
     console.log(Person.__proto__);
     console.log(Object.__proto__)
    
     console.log(person.__proto__ === Person.prototype );
     console.log(Person.__proto__ === Object.prototype); 

    看到这里,如果你对上面的输出没有任何疑问,并且回答的准确无误,那么阁下可以优雅的关掉这个页面,该忙啥忙啥吧,大佬就不要在这凑热闹啦,如果你有什么疑问的话还请你继续看下去

    首先我们针对上面的代码明确以下几个概念

    1、prototype,原型,那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。(在js中有这么一个概念:万物皆对象。请大家记住这个概念,在es6中体现的尤为明显)

    2、__proto__,这是每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

    3、constructor,每个原型都有一个 constructor 属性指向关联的构造函数。

    然后我们引入原形链的概念:当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

    接下来我们看下上面的代码的输出:

     function Person() {
    
     }
    
     var person = new Person();
    
     console.log(person);//Person {}
     console.log(Person);//[Function: Person]
     console.log(Object)//[Function: Object]
    
     console.log(person.prototype);//undefined
     console.log(Person.prototype);//Person {}
     console.log(Object.prototype);//{}
    
     console.log(person.constructor);//[Function: Person]
     console.log(Person.constructor);//[Function: Function]
     console.log(Object.constructor);//[Function: Function]
    
     console.log(person.__proto__);//Person {}
     console.log(Person.__proto__);//[Function]
     console.log(Object.__proto__)//Function
    
     console.log(person.__proto__ === Person.prototype );//true
     console.log(Person.__proto__ === Object.prototype); //false  ??这里笔者有一点不是很理解,如果有大佬可以解释下的话就再好不过了
     console.log(Object.getPrototypeOf(person) === Person.prototype) // true
    
     console.log(Object.getPrototypeOf(Object) == Person.__proto__) //true
    
     console.log({Object}.prototype,'123') // {}

    然后我们可以用一张图来表示下之前梳理的关系

    顺便还要说一下,图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。

     本篇知识点部分来自于https://github.com/mqyqingfeng/Blog/issues/2,大家有兴趣的可以去看看,作者写的js系列还是很棒棒的

  • 相关阅读:
    删除 AP 发票相关脚本
    js框架简明
    16 款最流行的 JavaScript 框架
    八款你不得不知的开源前端JS框架
    ExtJS面向对象
    js6类和对象
    js模拟类
    js实现继承
    Html中各种空格的显示
    常用快速原型设计工具大比拼、原型设计工具哪个好用
  • 原文地址:https://www.cnblogs.com/yunzhongjun/p/10661284.html
Copyright © 2011-2022 走看看