prototypeproto与constructor详解

Posted zoutuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了prototypeproto与constructor详解相关的知识,希望对你有一定的参考价值。

在正式开始之前,我们先说一下对象的保存

技术图片

 

 栈内存存放的是该对象的引用指针,真正的对象在堆内存中存着

多个对象的保存

技术图片

 

 

function Foo() {...};
let f1 = new Foo();

 

 

创建一个构造函数Foo(),并使用new关键字实例化一个f1对象

1.__proto__属性

 

首先有两个要点:1.__proto__和constructor属性是对象独有的;2.prototype属性是函数所独有的。

在js中,万事万物皆对象,所以函数也有__proto__和prototype属性

技术图片

 

 

 __proto__属性,对象所独有,它是由一个对象指向一个对象即指向他们的原型对象。它的作用是当访问一个对象的属性时,如果该对象内部不存在该属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里面找,如果父对象也不存在该属性,就继续往父对象的__proto__属性所指的那个对象(爷爷对象)里找,若还没找到,则继续向上找,直到到达原型链顶端null(null为原型链的终点)。

由以上这种通过__proto__属性来连接对象直到null的一条链即为原型链

2.prototype属性

技术图片

prototype属性,函数所独有的,由一个函数指向对象,它的含义就是函数的原型对象,也就是这个函数所创建的实例的原型对象。f1.__proto__ ===   Foo.prototype 这两个完全一样。prototype属性作用就是包含可以由特定类型的所有实例共享的属性和方法。也就是让该函数所实例化的对象们都可以找到公用的属性和方法。任何函数在创建的时候,会默认同时创建该函数的prototype对象

 3.constructor属性

技术图片

constructor属性也是对象才拥有的,他是从一个对象指向一个函数含义就是指向该函数的构造函数每个对象都有构造函数(本身拥有或继承而来),从上图看来,Function这个对象有点特殊,它的构造函数就是它自己(因为Funtion可以看成是一个函数,也可以是一个对象),所有函数和对象都是由Function构造函数得来,所以constructor属性的终点就是Function这个函数

 4.总结

 1.牢记两点:1.__proto__和constructor属性是对象所独有的;2.prototype属性时函数所独有的,因为函数也是对象,所以函数也有__proto__和constructor属性

 2.__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在该属性,就沿着它的__proto__属性向上查找,在父对象里面查找,若父对象不存在,则继续向上查找,直到到达终点null,再向上找就相当于在null上取值,会报错。这就是所谓的原型链

3.prototype属性的作用就是让该函数实例化的对象都可以访问到公共的属性和方法,即f1.__proto__ === prototype

4.constructor属性含义是指向该对象的构造函数,最终的构造函数都指向Funtion

文中内容参考一下几篇博文

https://blog.csdn.net/cc18868876837/article/details/81211729

https://www.cnblogs.com/xiaohuochai/p/5721552.html
https://www.cnblogs.com/Narcotic/p/6899088.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于prototypeproto与constructor详解的主要内容,如果未能解决你的问题,请参考以下文章

一张图理解prototypeproto和constructor的三角关系

一张图理解prototypeproto和constructor的三角关系

typescript TypeScript Private Constructos和Singletons

Uncaught TypeError: Cannot read properties of undefined (reading ‘Constructo

数据结构与算法之字典

太爽了!java接口异步不等待