什么是原型链?原型对象?原型?
我们来慢慢逐一解析。。。
原型对象:一个构造函数的prototype(原型)属性就是指向它的原型对象,通过这个构造函数实例化的对象,都可以共享原型对象中的属性和方法。
原型链:每个对象都有一个__proto__属性,这个属性指向一个原型对象。而原型对象也是一个对象,所以它也有自己的__proto__,直至指向为null值。为什么??后面会进一步解析。这一个链路过程就称为原型链。
js有几个点和特性要先牢记的。。
1.任何对象都有__proto__属性;
2.任何函数都有prototype属性;
3.一切皆对象(包括函数),对象也是函数;
4.ECMAScript规定了两个特殊的内置对象:Object和Function。他们的特殊性在于,他们本身既是对象又是函数,而他们同时也是对象和函数的构造器。

基本上都可以用一个三角形来解析一个环路的关系。这个是比较容易看懂的。
先放个大招来看看整个的原型链是怎么走的!

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

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

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

Function对象通过它本身来进行实例化。
1)new Function instanceof Function为true;
2)Function.__proto__ === Function.prototype
就能得出这个结论。
四,

继续继续。。没什么好解释
五,
说回Person.prototype

继续往下走!
六,

Object也是属于js的内置对象,
七,
如果按照对象都有__proto__属性的逻辑,因为Object.prototype是一个对象,如果由Object()生成就会有:
Object.prototype.__proto__ === Object.prototype 指向它本身,为了让原型链有终点,不无限循环。就让Object.prototype的__proto__来指向了null值。

关于Object.prototype,跟一般函数的prototype不一样,有一堆的方法,都是js对象的系统默认方法。
这些都是个人自己总结的经验,如有不对和错误,勿喷,欢迎指出错误!
欢迎大家互相交流~
网友评论