zhangsanshi / issue-blog

It's a blog rather than issue
0 stars 0 forks source link

有关 prototype 问题的一些理解 #38

Open zhangsanshi opened 7 years ago

zhangsanshi commented 7 years ago

一切从这个图开始 image

基础

1.什么是 __proto__

function F() {}; 
var a = new F();
a.__proto__ === a.constructor.prototype; //true

所以我们可以这么说 一般情况下,对象的 __proto__ 是其构造函数的 prototype(下面的题目 1 就出现特殊情况 )

2. 什么是 prototype

F.prototype //  Object {}
a.prototype //  undefined

函数内置的一个属性,默认是 {}(Object 实例)

问题

1. 为何 Object.prototype.__proto__ === null

按照上面的理解来说 Object.prototype{} {}.__proto__ 应该是其构造函数的 prototypeObject.prototype 所以可以得出 Object.prototype.__proto__ === Object.prototype ,但实际结果是 null ???

使用假设法

假设 Object.prototype.__proto__ === Object.prototype

那对于一个 Object 实例 o1= {} 我们去查找它的属性 xxx(即 o1.xxx),o1 没有 所以 o1 去它的构造函数 Objectprototype 中找(即 o1.__proto__ /Object.prototype) 显而易见默认是没有这个属性的,找不到,继续查询原型链
Object.prototype 的上一级原型链 是 Object.prototype.__proto__ ,这当然也找不到,继续上级原型链, 记得我们一开始假设 Object.prototype.__proto__ === Object.prototype,这时候你会发现进入一个循环中,走不出来,属性 xxx 不存在的时候,原型查找就出问题了 所以 Object.prototype.__proto__===null,直接切断了原型链的查找

2. Function instanceof Object === true

Function 为什么是 Object 的实例,首先看一下 Function 的原型链中存不存在 Object

Function.__proto__ === Object.prototype  // false

不存在,但是为什么会有实例关系 ??? 接着发现, Functionprototype__proto__Objectprototype

Function.prototype   // function () {}
Function.prototype.__proto__ === Object.prototype // true

发现 Function.prototype (记为 empty)是 Function 的实例,empty.__proto__ 按理说应该是 Function.prototype 但这里 却指向了 Object.prototype (这个问题暂时不说) 这里要说明一点 FunctionFunction 的构造函数 简单点 Function.__proto__ === Function.prototypeFunction.constructor.prototype === Function.prototype 所以有 Function.constructor=== Function 接下来就有了 Function.protype.__proto__ === Function.__proto__.__proto__ = Object.prototype 所以当判断实例的时候,查找 Function 的原型链 就找到了 Object 的原型,于是就有了实例关系

3. Object instanceof Function === true

ObjectFunction 的实例这个比较简单 Object 的原型链中存在 Functionprototype

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

4. 问题2的疑惑 Function.prototype.__proto__ === Object.prototype // true

假设 Function.prototype.__proto__ != Object.prototype,且表现为正常的理解,即Function.prototype.__proto__ === Function.prototype因为 Function 的构造函数是自身

function F() {}; 

接着查找F.notFoundF 没有,会查找到 F.__proto__,即 Function.prototype,接下来很显而易见的会死循环,所以 Function.prototype.__proto__ != Object.prototype

那能不能像 Object 一样设为 null 呢?如果为 null

a instanceof Object  //false
a instanceof Function //true 

这样也就不符合理解,从另一方面来说,a 应该是 Object 的实例 a instanceof Object // true 所以把

Function.prototype.__proto__ === Object.prototype

这样原型最终都会到 null 结束