谈谈对javascript Function, Prototype, Constructor的理解

Function:

首先,javascript里除了几个基本的数据类型(数字,字符串,布尔值,null, undefined),其他所有的东西都是对象(object)。

我们都知道function是用来声明函数的操作符,javascript有个特别的Function对象,俗称函数对象, 所有通过funtion声明出的对象都是Function对象,包括Object, Array, Boolean, String等几个基本类型对象,这几个也是js中最主要的构造函数,都是自己专属的属性和方法

如Object对象

function Object(){
    [native code]      
}

Object instanceof Function //true

 

Prototype:

所有函数在function的时候都会构建出prototype属性,指向prototype对象,这个prototype对象主要起到传宗接代的作用。它包括一个私有的[[proto]]指针,在firefox, webkit里公开为__proto__,为什么叫指针,因为它不是自身的属性,这个主要起到认祖归宗的作用,它永远指向其构造者的prototype。

function A(){}
A.hasOwnProperty('__proto__')  //false
A.__proto__===Function.prototype  //true

但这个__proto__最终指向哪里呢?

Function.prototype.__proto__=== Object.prototype  //true
Object.prototype.__proto__=== null //true

 

Constructor:

字面理解上就是构建者,它指向其构建者,也就是创建了自己的东东,不管是什么。所以理论上任何东西都是有constructor的。

构造函数的构建者是Function, prototype的构建者是其构造函数,

a = new A();
a.constructor === A // true
Object.prototype.constructor === Object  //true
Object.constructor === Function  // true
Function.constructor === Function  // true

但为什么说理论上, 实际上Function对象是通过function声明出来的,它们的constructor只是指针,最终指向Function。 只有prototype才是被构建出来的,有constructor属性。

Function.hasOwnProperty('constructor') //false

Function.prototype.hasOwnProperty('constructor') //true

 

参考资料:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object

 

没怎么写过博客,自认实用主义者,不搞学术研究,只是最近前端技术氛围太浓,忍不住才写几句,欢迎交流指正。

posted @ 2013-05-18 21:43  chunterg  阅读(623)  评论(0编辑  收藏  举报