让前端飞

原型链完全解析

2019-01-28  本文已影响3人  jie_YJ

什么是原型链?原型对象?原型?

我们来慢慢逐一解析。。。

原型对象:一个构造函数的prototype(原型)属性就是指向它的原型对象,通过这个构造函数实例化的对象,都可以共享原型对象中的属性和方法。

原型链:每个对象都有一个__proto__属性,这个属性指向一个原型对象。而原型对象也是一个对象,所以它也有自己的__proto__,直至指向为null值。为什么??后面会进一步解析。这一个链路过程就称为原型链

js有几个点和特性要先牢记的。。

1.任何对象都有__proto__属性;

2.任何函数都有prototype属性;

3.一切皆对象(包括函数),对象也是函数;

4.ECMAScript规定了两个特殊的内置对象:Object和Function。他们的特殊性在于,他们本身既是对象又是函数,而他们同时也是对象和函数的构造器。

来个简单的

基本上都可以用一个三角形来解析一个环路的关系。这个是比较容易看懂的。

先放个大招来看看整个的原型链是怎么走的!

全图

不知道你有没看懂,不过也没关系。。下面会逐个逐个解析!

一,

1

这个就是最开始那个,没什么好解释的。

二,

2

由一切皆对象得,函数也是对象的一种。那必然也是通过一个构造函数实例化出来。可以通过Person.__proto__ === Function.prototype来验证这个例子!而Function是属于function类型的对象(系统编译的二进制代码函数),可以直接拿来使用。所以有一个很神奇的回路:

三,

3

Function对象通过它本身来进行实例化。

1)new Function instanceof Function为true;

2)Function.__proto__ === Function.prototype

就能得出这个结论。

四,

4

继续继续。。没什么好解释

五,

说回Person.prototype

4

继续往下走!

六,

6.

Object也是属于js的内置对象,

七,

如果按照对象都有__proto__属性的逻辑,因为Object.prototype是一个对象,如果由Object()生成就会有:

Object.prototype.__proto__ === Object.prototype 指向它本身,为了让原型链有终点,不无限循环。就让Object.prototype的__proto__来指向了null值。

7,

关于Object.prototype,跟一般函数的prototype不一样,有一堆的方法,都是js对象的系统默认方法。


这些都是个人自己总结的经验,如有不对和错误,勿喷,欢迎指出错误!

欢迎大家互相交流~

上一篇下一篇

猜你喜欢

热点阅读