JavaScript-原型链

76 阅读1分钟

一、首先不能只是单纯知道它的几个属性而已,它顶端关于function、object的那些乱七八糟的关系也要好好复习一遍。

来几篇好文背一背:

juejin.cn/post/684490…

blog.csdn.net/weixin_4019…

有几个重要结论,好好背一下:

结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端。

结论2:在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype。

结论3:内置的Object是其实也是一个函数对象,它是由Function创建的。

结论6:内置的Function也是一个函数对象,它是通过自己来创建自己的。

结论4:js中每一个对象或函数都有__proto__属性,但是只有函数对象才有prototype属性。

结论5:Function.prototype是个特例,它是函数对象,但是没有prototype属性。其他所有函数都有prototype属性。

结论7:函数也是对象,因为Function.prototype__proto__指向Object.prototype。

思路:

1、首先,函数有prototype属性指向原型。函数创建的实例有一个__proto__的属性指向原型。原型有一个constructor属性指向函数。

2、有几个特殊的点需要注意一下:

2.1、原型的顶端是Object.prototype。

2.2、javascript中对象是由Object创建的,函数是由Function创建的。

所以

function Person(){   }
var obj = {};
alert(obj.__proto__ === Object.prototype);//true
alert(Person.__proto__ === Function.prototype);//true

对象或函数都有__proto__属性,但是只有函数对象才有prototype属性(有一个例外:Function.prototype是个特例:Function.prototype.prototype === undefined; //true)。

Function.prototype.__proto__=== Object.prototype;//true

2.3、内置的Function是一个函数对象,它是通过自己来创建自己的。内置的Object也是一个函数对象,它是由Function创建的。

(typeof Function.__proto__) === function;//true
Function.__proto__=== Function.prototype;//true
//Function这个函数对象,由其自身通过Function函数构造的。


Object.__proto__ === Function.prototype;