日期:2014-05-16  浏览次数:20390 次

js中先有Function还是先有Object
我们知道js中函数是Function类型的实例,而Object是一个构造函数,故也是Function类型的实例。又因为js中所有对象都是继承Object类型,Function是一个构造函数,当然也就是个对象,所以也继承Object。那这样,就有个问题,Function的产生需要Object,而Object产生又需要Function,那到底是先有哪个,js中具体是怎么实现的?有大神知道吗?这个问题貌似有点像,鸡和蛋的问题。
------解决方案--------------------
自盘古开天辟地,js中并不是就有了Object, 而是Object.prototype。

js中的万物(原始值除外)都是继承自Object,唯独一个对象例外,那就是Object.prototype。


Object  instanceof Object;  //true
Object.prototype  instanceof Object; // false

JS中没有类,当我们说一个变量是另一个变量的实例时,我们在说什么?(instanceof比较的是什么?)
借助Object.create我们有以下的栗子:

var p = {test:1}
var obj = Object.create(p)
function A(){}
obj instanceof A  //false
A.prototype = p
obj instanceof A  //true


当我们说一个对象继承自某个Constructor时,其实我们是在说,从这个对象的原型链上找到了Constructor.prototype.

所以,Object.prototype可以先于Object出现,然后用这个prototype构造出Function.prototype,有了Function.prototype再构造出Function,Object这几个构造器。

然后把Object.prototype挂到Object上,Function.prototype挂到Function上。

好比栗子中的obj构造自p,而obj构造出来之后,p才挂到A上,我们说obj是A类型的,但是obj是用A.prototype(就是p)构造出来的。

分析可得:全局下的Object 构造自 Function.prototype, Function.prototype构造自Object.prototype

Object.getPrototypeOf(Object) === Function.prototype   //全等哦
Object.getPrototypeOf(Function.prototype) === Object.prototype  //全等哦


所以,是先有的Object.prototype,再有的Function.prototype,再有的Function和Object。

个人愚见,仅供参考。