对原型、原型链、 Function、Object 的理解

2023-05-29 0 1,028

难题

有如下表所示标识符:

//标识符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:画出标识符1的蓝本图?

难题2:从标识符2你能得出什么结论?试画出蓝本图?

难题3:解释标识符3的原因?

————————————————————————-

解答:

在解答上面的难题之前,先记住下面几句话,这几句话能解释一切关于蓝本方面的难题:

当 new 一个函数的时候会创建一个对象,『函数.prototype』 等于 『被创建对象.__proto__』一切函数都是由 Function 这个函数创建的,所以『Function.prototype === 被创建的函数.__proto__』一切函数的蓝本对象都是由 Object 这个函数创建的,所以『Object.prototype === 一切函数.prototype.__proto__』

下面是标识符1的蓝本图:

对原型、原型链、 Function、Object 的理解

(1)People函数创建了对象 p,所以People.prototype === p.__proto__;

(2)Object函数创建了People.prototype对象,所以Object.prototype === People.prototype.__proto__;

(3)People 作为对象的角色被函数Function创建,所以 Function.prototype === People.__proto__

下面是标识符2的蓝本图:

对原型、原型链、 Function、Object 的理解

(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

至此,难题全被完美解决。

欢迎进群探讨技术,点击此微信扫码进群

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务