理解js原型链

672 阅读1分钟

原型链

1.原型链示意图

图的解析

  • Object.prototype 是原型链最顶端
  • Object Date Math Function 等内置构造函数 在原型链中 和 function Foo 是基本对等的, 都是有 构造起Function创建的,因此有 Foo.__proto__ === Object.__proto__ === Function.__proto__ = Function.prototype ;(注:Function 构造器是Functiion本身)

2. 主要记住并理解两条原型链指向即可,

如图所示:

链1


Object ---> Function.prototype ---> Object.prototype ---> null

---------- 亦即
Object.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype
Object.prototype.proto === nullÏ

链2


new Foo() --> Foo.prototype --> Object.prototype ---> null

---------- 亦即
new Foo().__proto__ === Foo.prototype,
Foo.prototype.__proto__ === Object.prototype
Object.prototype.__prototype === null


3. 基佬FunctionObject

原型链里面,最大的一对儿基佬就睡 FunctionObject了,这两个都比较特殊,Object.prototype 是一切对象原型链的最顶端, Function 是所有函数的构造器,如(Object,Date, function Foo)等,最牛逼的是,Function 本身 的构造器也是他自己。

3.1 Function 本身 的构造器也是他自己,因此就有了,Function.__proto__ === Function.prototype,这块应该是导正整个原型链理解起来变复杂的 根源。
3.2 Function的 原型链,又经过 Function.prototype最终指向了 Object.prototype 如Function --> Function.prototype ---> Object.prototype;
3.3 Object instanceof Function === true, Function instanceof Object === true ,instanceof是一个二元运算符,如:A instanceof B. 其中,A必须是一个合法的JavaScript对象,B必须是一个合法的JavaScript函数 (function). 判断过程如下:如果函数B在对象A的原型链 (prototype chain) 中被发现,那么instanceof操作符将返回true,否则返回false. 由于 Object 和 Function 都是函数对象,并且都可以在原型链中找到彼此 ,所以 就有了 互为 实例的结果