1.当 new 一个函数的时候会创建一个对象,『函数.prototype』 等于 『被创建对象.proto』
2.一切函数都是由 Function 这个函数创建的,所以『Function.prototype === 被创建的函数.proto』
3.一切函数的原型对象都是由 Object 这个函数创建的,所以『Object.prototype === 一切函数.prototype.proto』
原型图
原型图.png示例
//代码1
function People(){}
var p = new People()
p.__proto__ === People.prototype
People.__proto__ === Function.prototype
People.prototype.__proto__ === Object.prototype
//代码2
Function.prototype === Function.__proto__
Function.prototype === Object.__proto__
Function.prototype.__proto__ === Object.prototype
Function instanceof Object
//代码3
Object instanceof Function
Function instanceof Object
Function instanceof Function
Object instanceof Object
下面是代码1的原型图:
image-
(1)People函数创建了对象 p,所以People.prototype === p.proto;
-
(2)Object函数创建了People.prototype对象,所以Object.prototype === People.prototype.proto;
-
(3)People 作为对象的角色被函数Function创建,所以 Function.prototype === People.proto
下面是代码2的原型图:
image-
(1)任何函数都是 Function 创建,所以Function 创建了 Function,所以 Function.prototype === Function.proto;
-
(2)Object 也是函数。所以Function创建了Object,所以 Function.prototype === Object.proto ;
-
(3)Function.prototype 是普通对象,普通对象是由Object创建的,所以 Function.prototype.proto === Object.prototype
关于代码3:
instanceof 的作用是判断一个对象是不是一个函数的实例。比如 obj instanceof fn, 实际上是判断fn的prototype是不是在obj的原型链上。比如: obj.proto === fn.prototype, obj.proto.proto === fn.prototype,obj.proto...proto_ === fn.prototype,只要一个成立即可。
所以(根据图2来找)
- 对于 Function instanceof Function,因为 Function.proto === Function.prototype,所以为true。
- 对于 Object instanceof Object, 因为 Object.proto.proto === Function.prototype.proto === Object.prototype , 所以为true
- 对于 Function instanceof Object, 因为 Function.proto.proto === Function.prototype.proto === Object.prototype, 所以为 true
- 对于 Object instanceof Function, 因为 Object.proto === Function.prototype,所以为 true
至此,问题全被完美解决。
网友评论