一、对象的原型([[prototype]]
或者__proto__
)
JavaScript 中所有的对象中都包含了一个
[[prototype]]
内部属性
这个属性值所对应的就是该对象的原型。
[[prototype]]
作为对象的内部属性,是不能被直接访问的。
所以为了方便查看一个对象的原型,
Chrome
等大型浏览器厂商提供了__proto__
这个非标准对象原型访问器
ECMA
引入了标准对象原型访问器Object.getPrototype(Object)
二、函数的 prototype
下面两句话很重要
1、每一个函数都有一个
prototype
属性,但是普通对象是没有的;
prototype
下面又有个construetor
,指向这个函数。
2、每个对象都有一个名为
_proto_
的内部属性,指向它所对应的构造函数的原型对象,原型链基于_proto_
;
不出意外你应该是晕了,没事,我们用图表示一下:
![](https://img.haomeiwen.com/i27493437/6c2d1b0fb662079a.png)
eg
![](https://img.haomeiwen.com/i27493437/c10c75a702d74497.png)
Object
是我们的构造对象的顶级函数
它的
prototype
属性就是Object的原型对象
Object
的原型对象的constructor
就指向Object
函数本身
三、对象__proto__
和函数的prototype
的关系
3.1、相关知识
构造函数
3.2、构造函数是什么
3.3、构造函数的原理(new之后发生了什么)
官方解释:
- 创建一个空的简单
JavaScript
对象(即{}
);- 为步骤1新创建的对象添加属性
__proto__
,将该属性链接至构造函数的原型对象- 将步骤1新创建的对象作为
this
的上下文 ;- 如果该函数没有返回对象,则返回
this
。
咱们的总结:
1、自从用
new
调用函数后,JS引擎就会在内存中创建一个空对象{}
,const newObj = {};
2、将新对象newObj的__proto__
属性链接至构造函数的原型对象newObj.__proto__ = FunctionName.prototype
3、构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)this = newObj
4、执行构造函数内部代码;
5、如果该函数没有返回对象,则默认返回this。
构造函数中的this指向,指向构造出来的实例对象
3.4、构造函数创建实例
const Person = function () {
this.name = "张三";
};
const p = new Person();
console.log(p.__proto__ === Person.prototype); //true
我们定义了一个函数
Person
使用
Persong
构造函数创建一个p
的实例对象
实例
p
的原型__protp__
指向构造函数Person
的prototype
所以函数的
prototype
和 对象的[[Prototype]]
或者__proto__
指向同一个原型对象
那我们继续更新图:
![](https://img.haomeiwen.com/i27493437/e4c4a4639c833d48.png)
四、原型链
当我们要在一个对象(假设对象 A)上访问一个属性
JavaScript
首先会看对象A
本身存不存在目标属性
若不存在,则会通过它的
[[Prototype]]
或者__proto__
查看它的原型对象(假设对象 B)存不存在待查找属性
若还是不存在,则继续查找原型对象 B 的原型
[[Prototype]]
或者__proto__
(假设对象 C)存不存在目标属性
一直到找到属性或者返回
null
(就是找到 Object 了,还是没找到属性)
其中 对象 A —> 对象 B —> 对象 C —> … —> Object 就是原型链的基本模型
最后更新一次关系图:
![](https://img.haomeiwen.com/i27493437/e617c8d7cd24c03f.png)
网友评论