前提概念
- 在
JavaScript中,函数属于对象类型。任何一个对象都是Object的实例。 Function是 所有函数对象的基础,而Object则是所有对象(包括函数对象)的基础。__proto__和constructor属性是对象所独有的;prototype属性是函数所独有的,且因函数属于对象,因此函数也拥有__proto__和constructor属性- 函数的
prototype属性值被称为该函数的原型
图形解析
将上面的图形拆分为易于理解的代码:
// 声明一个函数 Foo
var Foo = function () {};
var a = new Foo();
var b = new Foo();
// 1. Object构造函数原型的 __proto__ 属性指向null
Object.prototype.__proto__ === null
// 2. Function构造函数原型的 __proto__ 属性指向基础对象原型
Function.prototype.__proto__ === Object.prototype
// 3. 函数Foo原型的 __proto__ 属性指向基础对象原型
Foo.prototype.__proto__ === Object.prototype
// 4. 函数Foo原型的 __proto__ 属性指向基础函数原型
Foo.__proto__ === Function.prototype
// 5. 函数Foo原型的constructor属性指向Foo函数本身
Foo.prototype.constructor === Foo
-
为何
Foo.prototype.__proto__指向Object.prototype?这里容易错误根据1,2 推断
Foo.prototype.__proto__ === Function.__proto__,但实际上:__proto__是指向创建该对象的构造函数原型,函数的原型一般是对象, -
为何 4 会成立?
每一个函数都属于原始构造函数
Function的实例。所有函数__proto__指向构造函数Function的原型 -
为何
Object.prototype.__proto__指向null?理解上面之后,这个问题首先想到的是这里不应该指向
Object.prototype吗,实际上这里JS为了避免循环引可以为止,且Object.prototype.__proto__为null是不可修改的。 -
Object是通过Function创建还是Function由Object创建?// 从继承类上看难以辨别 Object intanceof Function // true Function intanceof Object // true // 创建Object构造函数的 构造函数是Function Object.__proto__ === Function.prototype // 创建Function构造函数的 构造函数是Function Function.__proto__ === Function.prototype这里很容易认为是Object构造函数创建了Function,实际上是 Function 创建了 Object、Number、String、Date、function fn(){}等第一批构造函数,也包括他自己