js对象(二)—— 函数与对象的关系(认识原型链)

首先,结合以前的一篇博客js对象(一)——建立对象开头,为了理解对象,抛出了一系列比较绕的概念,即对象和函数的关系,搞清楚了这个问题,可能才算真正理解了什么是对象,什么是函数。
仍是先看一些说法和描述:javascript

JavaScript中,一切都是对象,函数也是对象,数组也是对象,可是数组是对象的子集。
函数其实是对象,并且与其余引用类型同样具备属性和方法,因为函数是对象,所以函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

对象都是由函数建立的。
全部的对象都是由Object继承而来,而Object对象倒是一个函数。html

每个函数实际上都是Function类型的实例java

(在这里看来,函数与对象之间有着说不清道不明的关系,函数是对象,对象又是又函数建立的,因此究竟是先有的函数仍是先有的对象,他们的原型或者说底层又有什么关系呢😵?)segmentfault

借助 prototype,__proto__,constructor这三个属性,先从最简单的开始提及😜:数组

图一

经过原型模式建立对象,咱们接触到了对象建立的机制,如图:闭包

var o1 = new Object()
var o2 = new Object()

图片描述

图二

接下来,再看另外一种构造函数创造机制:函数

function foo() {}
var f1 = new foo()
var f2 = new foo()

图片描述

因为一切对象(除Object.prototype)都继承自Object,因此不难理解这里最大的boss是Object.prototype,而构造它的原型对象是null,这不是证实了它就是最大的boss吗?然而,并无那么简单,那么,function()又是怎么回事呢?继续看:spa

图三

图片描述

咱们知道,一切函数都是Function的实例,而参考MDN-function ,咱们发现:prototype

Function 构造函数 建立一个新的Function对象。 在 JavaScript 中,
每一个函数实际上都是一个Function对象。

全局的Function对象没有本身的属性和方法, 可是, 由于它自己也是函数,因此它也会经过原型链从Function.prototype上继承部分属性和方法。3d

这句话“Function从Function.prototype上继承部分属性和方法”,能够解释

Function.__proto__==Function.prototype

便可以说函数是由Function建立的,那么Function由自身建立,因此Function.__proto__就指向了建立它的函数(也就是本身)的prototype。

总图

最后,再来一张总的图:

图片描述

经过这张图咱们就能够轻松知道:

图片描述

图片描述

图片描述

再总结一下,函数与对象的关系,看来,最大的boss仍是Object.prototype,由于从箭头的进出来看,Object.prototype是没有被谁创造出来的,而其余对象都可以找到建立它的原型对象。

而上面所说的

对象都是由函数建立的。

一切都是对象,函数也是对象

可能要上升到一个哲学的高度去理解了。但咱们却要理解其底层的运行机制,也就是上面的总图。掌握了那张图,对接下来理解原型链,继承很是有帮助(简直就是必须😁)。

最后,欢迎你们围观指正!
参考:深刻理解javascript原型和闭包系列

相关文章
相关标签/搜索