本文深入解析JavaScript对象模型,重点阐述Function构造器的自举特性及原型链机制。通过代码验证Function、Object与各类内置构造器的关系,区分用户定义函数与内置构造函数创建的对象在constructor属性上的差异,并揭示内置对象作为函数派生类型的本质。
JavaScript对象模型概述
对象模型

图中红色虚线代表隐式的Prototype链。
该对象模型图信息量较大,包含诸多细节需仔细体会,建议编写测试代码进行验证。彻底理解此图,即意味着对JavaScript语言有了较为全面的掌握。以下为补充说明:
Function构造器的自举特性
1. 图中多处提及build-in Function constructor,这指向同一个对象,可通过测试验证:
代码如下:
//Passed in FF2.0, IE7, Opera9.25, Safari3.0.4
Function==Function.constructor //result: true
Function==Function.prototype.constructor //result: true
Function==Object.constructor //result: true
//Function also equals to Number.constructor, String.constructor, Array.constructor, RegExp.constructor, etc.
function fn(){}
Function==fn.constructor //result: true 这揭示了几个关键点:Function指向系统内置的函数构造器(build-in Function constructor);Function具有自举性;系统中所有函数均由Function构造。
用户定义对象与内置对象的constructor差异
2. 左下角的obj1, obj2...objn泛指通过类似代码创建的对象:function fn1(){}; var obj1=new fn1();。这些对象没有本地的constructor方法,但会从Prototype链上继承一个constructor方法,即fn.prototype.constructor。从函数对象的构造过程可知,它即为fn本身。
3. 右下角的obj1, obj2...objn泛指通过类似代码创建的对象:var obj1=new Object();、var obj1={;}、var obj1=new Number(123);或obj1=/\w+/;等。因此,这些对象Prototype链的指向、从Prototype链继承而来的constructor的值(即其constructor是build-in Number constructor还是build-in Object constructor等)依赖于具体的对象类型。另外需注意,var obj=new Object(123);这样创建的对象,其类型仍为Number,即同样需要根据参数值的类型来确定。它们同样没有本地constructor,而是从Prototype链上获得继承的constructor方法,即build-in *** constructor,具体是哪一个由数据类型确定。
示例代码
代码如下:
//自定义对象代表,对应Javascript Object Model中的use defined functions
function Foo(){}
//自定义对象创建的对象实例的代表,对应Javascript Object Model中的objects that created by user defined functions
var foo = new Foo();
//String内置函数代表
//str为内置函数创建的对象实例的代表,对应Javascript Object Model中的objects that created by build-in constructors
var str = new String("string"); 内置对象与自定义对象的创建流程一致性
内存展现

你会发现,它与《理解Javascript_09_Function与Object》中的内存分析图一致。原因在于,《数据模型》中提到,内置对象均可视为函数的派生类型,例如Number instanceof Function为true,Number instanceof Object为true。在此意义上,可将它们与用户定义的函数等同看待。因此,内置对象和自定义对象的创建流程是相同的。
本文是在理解《Function与Object》的基础上撰写的,因此要理解本文,必须理解Function与Object的关系!
最后写一点感言:令人发狂的理论!