javascript原型和闭包的个人理解

来源:互联网 发布:mxo魔法协会 知乎 编辑:程序博客网 时间:2024/05/06 19:18

定义一个函数    function Fn(){}

定义一个对象    var f1 = new Fn()

在javascript中,对象其实就是一些属性的集合,对象都是通过函数来创建的(通过字面量创建的对象,其实底层也是通过函数来创建,Object、Array都是函数,可以通过 typeof 方法检测),如下图

但其实,函数也是一种对象,你可以给函数自定义属性,它也是一些属性的集合。每个函数(Fn)都有一个原型属性(prototype),它的值是一个对象(Fn.prototype),该对象一定有一个constructor属性,指向这个函数(Fn.prototype.constructor === Fn),通过这个函数创建的对象 f1 也一定有一个constructor属性,指向这个函数(f1.constructor === Fn)。

那么,问题来了,既然函数也是对象,那么我们在使用 typeof 方法时,如果是值类型,返回number/boolean/string,如果是引用类型,为什么不直接返回Object,而要返回function/Object 两种呢? javascript 中函数和对象到底有着什么千丝万缕的纠葛呢?

在javascript中,存在两个顶级函数(对象,历史上就很纠葛)  function Object(){} 和 function Function(){},所有对象都有一个隐式的属性 __porto__,该属性指向创建该对象的函数的原型。下面我们来看看Object(){} 和 Function(){} 的原型和 __proto__ 吧,如图

可以看出,Object(){} 的 __proto__ 属性指向创建它的函数的原型 Function.prototype,其值是 function(){} 函数,Function(){} 的 __proto__ 属性指向它自己的原型 Function.prototype ,其值也是 function(){} 函数,实际上,对象 Function.prototype 的 __proto__ 属性指向了 Object.prototype,这就是对象和函数的关系,对象由函数创建(对象的 __proto__ 属性指向创建该对象函数的原型),而函数的原型又是对象(所有自定义函数的 __proto__ 属性指向顶级函数的原型 Function.prototype,Function.prototype 的 __proto__ 属性 指向顶级 Object(){} 的原型)。


0 0