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