js中先有Function,还是先有Object

js中先有Function,还是先有Object

自盘古开天辟地,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。


伪代码大致是这样,create元操作的含义是使用给定的对象作为原型构造一个新的对象。

var ObjectPrototype = create( );   // 开天辟地
 
var FunctionPrototype = create( ObjectPrototype );   
//FunctionPrototype(后被赋值给了Function.prototype)是Object类型的
//因为其原型是ObjectPrototype
 
var Function = create( FunctionPrototype );
 
Function.prototype = FunctionPrototype;
 // Function是Function类型的,也是Object类型的
//言外之意,Function对象 原型链上有Function.prototype和Object.prototype
 
Object =  create( FunctionPrototype ); 
 
Object.prototype = ObjectPrototype;
 //Object是Function类型的,也是Object类型的
//言外之意Object对象的原型链上有Function.prototype和Object.prototype 

当然,在构造Function的时候远没有那么简单,这里只是简单解释了一下Object和Function之间错综复杂的关系。

发布于 2018-09-17