Open zhangsanshi opened 7 years ago
一切从这个图开始
__proto__
function F() {}; var a = new F(); a.__proto__ === a.constructor.prototype; //true
所以我们可以这么说 一般情况下,对象的 __proto__ 是其构造函数的 prototype(下面的题目 1 就出现特殊情况 )
prototype
F.prototype // Object {} a.prototype // undefined
函数内置的一个属性,默认是 {}(Object 实例)
{}
Object.prototype.__proto__ === null
按照上面的理解来说 Object.prototype 是 {} {}.__proto__ 应该是其构造函数的 prototype 即 Object.prototype 所以可以得出 Object.prototype.__proto__ === Object.prototype ,但实际结果是 null ???
Object.prototype
{}.__proto__
Object.prototype.__proto__ === Object.prototype
null
使用假设法
假设 Object.prototype.__proto__ === Object.prototype
那对于一个 Object 实例 o1= {} 我们去查找它的属性 xxx(即 o1.xxx),o1 没有 所以 o1 去它的构造函数 Object 的 prototype 中找(即 o1.__proto__ /Object.prototype) 显而易见默认是没有这个属性的,找不到,继续查询原型链 Object.prototype 的上一级原型链 是 Object.prototype.__proto__ ,这当然也找不到,继续上级原型链, 记得我们一开始假设 Object.prototype.__proto__ === Object.prototype,这时候你会发现进入一个循环中,走不出来,属性 xxx 不存在的时候,原型查找就出问题了 所以 Object.prototype.__proto__===null,直接切断了原型链的查找
Object
o1= {}
xxx
o1.xxx
o1
o1.__proto__ /Object.prototype
Object.prototype.__proto__
Object.prototype.__proto__===null
Function instanceof Object === true
Function 为什么是 Object 的实例,首先看一下 Function 的原型链中存不存在 Object
Function
Function.__proto__ === Object.prototype // false
不存在,但是为什么会有实例关系 ??? 接着发现, Function 的 prototype 的 __proto__ 是 Object 的 prototype
Function.prototype // function () {} Function.prototype.__proto__ === Object.prototype // true
发现 Function.prototype (记为 empty)是 Function 的实例,empty.__proto__ 按理说应该是 Function.prototype 但这里 却指向了 Object.prototype (这个问题暂时不说) 这里要说明一点 Function 是 Function 的构造函数 简单点 Function.__proto__ === Function.prototype 即 Function.constructor.prototype === Function.prototype 所以有 Function.constructor=== Function 接下来就有了 Function.protype.__proto__ === Function.__proto__.__proto__ = Object.prototype 所以当判断实例的时候,查找 Function 的原型链 就找到了 Object 的原型,于是就有了实例关系
Function.prototype
empty
empty.__proto__
Function.__proto__ === Function.prototype
Function.constructor.prototype === Function.prototype
Function.constructor=== Function
Function.protype.__proto__ === Function.__proto__.__proto__ = Object.prototype
Object instanceof Function === true
Object 是 Function 的实例这个比较简单 Object 的原型链中存在 Function 的 prototype
Object.__proto__ === Function.prototype //true
Function.prototype.__proto__ === Object.prototype // true
假设 Function.prototype.__proto__ != Object.prototype,且表现为正常的理解,即Function.prototype.__proto__ === Function.prototype因为 Function 的构造函数是自身
Function.prototype.__proto__ != Object.prototype
Function.prototype.__proto__ === Function.prototype
function F() {};
接着查找F.notFound,F 没有,会查找到 F.__proto__,即 Function.prototype,接下来很显而易见的会死循环,所以 Function.prototype.__proto__ != Object.prototype
F.notFound
F
F.__proto__
那能不能像 Object 一样设为 null 呢?如果为 null
a instanceof Object //false a instanceof Function //true
这样也就不符合理解,从另一方面来说,a 应该是 Object 的实例 a instanceof Object // true 所以把
a
a instanceof Object // true
Function.prototype.__proto__ === Object.prototype
这样原型最终都会到 null 结束
一切从这个图开始
基础
1.什么是
__proto__
所以我们可以这么说 一般情况下,对象的
__proto__
是其构造函数的prototype
(下面的题目 1 就出现特殊情况 )2. 什么是
prototype
函数内置的一个属性,默认是
{}
(Object 实例)问题
1. 为何
Object.prototype.__proto__ === null
按照上面的理解来说
Object.prototype
是{}
{}.__proto__
应该是其构造函数的prototype
即Object.prototype
所以可以得出Object.prototype.__proto__ === Object.prototype
,但实际结果是null
???使用假设法
假设
Object.prototype.__proto__ === Object.prototype
那对于一个
Object
实例o1= {}
我们去查找它的属性xxx
(即o1.xxx
),o1
没有 所以o1
去它的构造函数Object
的prototype
中找(即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
的prototype
的__proto__
是Object
的prototype
发现
Function.prototype
(记为empty
)是Function
的实例,empty.__proto__
按理说应该是Function.prototype
但这里 却指向了Object.prototype
(这个问题暂时不说) 这里要说明一点Function
是Function
的构造函数 简单点Function.__proto__ === Function.prototype
即Function.constructor.prototype === Function.prototype
所以有Function.constructor=== Function
接下来就有了Function.protype.__proto__ === Function.__proto__.__proto__ = Object.prototype
所以当判断实例的时候,查找Function
的原型链 就找到了Object
的原型,于是就有了实例关系3.
Object instanceof Function === true
Object
是Function
的实例这个比较简单Object
的原型链中存在Function
的prototype
4. 问题2的疑惑
Function.prototype.__proto__ === Object.prototype // true
假设
Function.prototype.__proto__ != Object.prototype
,且表现为正常的理解,即Function.prototype.__proto__ === Function.prototype
因为Function
的构造函数是自身接着查找
F.notFound
,F
没有,会查找到F.__proto__
,即Function.prototype
,接下来很显而易见的会死循环,所以Function.prototype.__proto__ != Object.prototype
那能不能像
Object
一样设为null
呢?如果为null
这样也就不符合理解,从另一方面来说,
a
应该是Object
的实例a instanceof Object // true
所以把这样原型最终都会到
null
结束