js-我对原型,原型链的理解

function Foo(name)
 {
     this.name=name;
 }
 let f1=new Person('小明');  //经过new操做符构造一个Person实例
 console.log(f1.name) // 小明复制代码

  虽然是简简单单的两行代码,然而它们背后的关系倒是错综复杂的,以下图所示:bash

看到上面的图片,确定有人看不下去了,说实话,我刚开始看到这张图片,我也不想看了,不过今天我会跟你们讲清楚函数

1.这里面有几个重要属性,你们必定得明白,prototype,_proto_,constructor,js里万物皆对象,其中,prototype(原型属性)是函数所独有的,_proto_和constructor属性是对象所独有的,因  为函数也是对象,因此函数拥有以上三种属性。ui

一:prototype(原型属性)this

    这个属性是函数独有的,它是函数内部的一个指针,它指向一个原型对象 即 Person.prototype,这是构造函数的原型对象,它是从函数指向对象它的spa

做用
    就是包含能够由特定类型的全部实例共享的属性和方法,也就是让该函数所实例化的对象们均可以找到公用的属性和方法,再简而言之就是这里面的属性是共享的

 二:_proto_(这是一个隐藏的属性)prototype

由上图你们能够看到: f1._proto_===Foo.prototype Foo()._proto_===Function.prototype指针

它是从对象指向对象,它指向父级的原型对象,在建立实例对象时,实例在调用属性或者方法时会先去构造函数内部寻 找,若是没找到,实例对象就会去_proto_属性所指向的父级原型对象上寻 找,f1._proto_===Foo.prototype若是仍是没有则继续往上找(这就是一条原型链) 即Foo.prototype._proto_===Object.prototype,若是仍是没有就继续往上,Object.prototype._proto_===null,直到寻找到原型链的顶端nullcode

 三:constructor(构造函数属性)cdn

这是一个构造函数属性,它指向一个函数:f1.constructor===Foo.prototype.constructor===Foo()对象

   Foo().constructor===Function();

  1. 总结一下:
  2. 咱们须要牢记两点:①__proto__constructor属性是
    对象
    所独有的;② prototype属性是
    函数
    所独有的,由于函数也是一种对象,因此函数也拥有__proto__constructor属性。
  3. __proto__属性的
    做用
    就是当访问一个对象的属性时,若是该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点
    null
    ,而后返回undefined,经过__proto__属性将对象链接起来的这条链路即
    咱们所谓的原型链

  4. prototype属性的
    做用
    就是让该函数所实例化的对象们均可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype
  5. constructor属性的含义就是
    指向该对象的构造函数
    ,全部函数(此时当作对象了)最终的构造函数都指向
     Function
  6. 初学者可能会在何谓指向上困惑,所谓指向不过就是一个代称或者叫别名也好,好比一我的

     叫默罕默德.思哈尼.阿尔辛曼,这尼玛名字太长了吧,咱管他叫默,这是就叫指向它,二者等价
相关文章
相关标签/搜索