技术,互联网,eLearning …
标签类目:Javascript

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__…依次这样找下去。其过程如下图所示:

Javascript调用链

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

返回顶部