Javascript的原型链
在Javascript里,函数是一等公民,函数可以充当类,模块或者是对象的角色。
函数是Function的对象。 我们可以这样定义函数:
var fun = new Function();
等同于:
function fun(){}
每个函数对象都一个特殊的成员变量,叫做prototype。
对于每一个Javascript对象,有一个成员指向其instanceof对象,称为constructor,也有一个成员用于指向其instanceof对象的prototype,在Firefox里,这个成员叫做__proto__ 。
举个例子来说,对于fun函数, 如果我们这样定义:
var funObj = new fun();
那么下面两个等式是成立的:
funObj.constructor == fun; funObj.__proto__ == fun.prototype;
函数的prototype也有这样一个__proto__变量指向其instanceof对象的prototype,因为prototype也是一个对象。
因为函数是一等公民,Function和Object也都是函数的实例,所以下面几个等式也是成立的:
Function.__proto__ == Function.prototype Function.prototype.__proto__ == Object.prototype Object.__proto__ == Function.prototype Object.prototype.__proto__ == null //Object.prototyp是所有\_\_proto__的顶层
当调用一个对象的成员时,首先会从对象自身找,如果没找到,就查找其__proto成员,没找到则继续__proto的__proto__…依次这样找下去。其过程如下图所示:

在Firefox和ActionScript里面,可以通过__proto__引用对象的prototype,但在标准Javascript里不能这样使用,只能使用constructor.prototype这样的方式 。

