prototype和_proto_
基于两个基本概念:
1.prototype是函数(function) 的一个属性, 它指向函数的原型.
2.__proto__是对象的内部属性, 它指向构造器的原型, 对象依赖它进行原型链查询,instanceof 也是依赖它来判断是否继承关系.
prototype只有函数才有, 其他(非函数)对象不具有该属性. 而__proto__是对象的内部属性, 任何对象都拥有该属性.
可以得出一些结论:
1.所有的构造器都继承于Function.prototype, 甚至包括根构造器Object及Function自身。所有构造器都继承了Function.prototype的属性及方法。如length、call、apply、bind(ES5)等。
因为构造器是对象也是函数,有_proto_属性,指向构造器原型,而函数的原型就是Function.prototype,由此还可以推出Function._proto_===Function.prototype
2.函数也是对象, 函数是一等公民.
Function.prototype.__proto__ ===Object.prototype
Function.prototype的__proto__属性指向对象的原型,由概念2,说明Function.prototype是Object构造出来的。Function.prototype继承于Object.prototype。同时发现Object有三个身份:构造器、函数、对象。再次证明了结论1.
3.究竟它们是从哪里来的
Object.create(null)可以创建一个没有原型的对象。如下:
Object.prototype.__proto__ == Object.create(null).__proto__
即为Object.prototype.__proto__ ===null