javascript的__proto__和prototype

js.jpg

javascript的所有一切的起源是null。以null为原型,产生了一切Object,包括函数也是Object。但是null本省不是Object,其它都是。
任何一个Object都有一个__proto__指向自己构造函数的所对应的原型。
当声明一个函数时,如

function Foo(){}

函数申明时,都会产生以自己命名的构造函数,并产生一个原型。每个函数都有自己的原型,如Foo.prototypejavascript内部定义的函数也都有自己的prototype,默认只有函数对象拥有该属性。并且该属性的值指向它对应的prototype

Object->Object.prototype
Number->Number.prototype
Function->Function.prototype

因为函数本省也是对象,所以函数也有自己的__proto__,他们都指向Function.propetype。因为他们是通过Function构造函数构造的。比如上述的Foo函数,就有

Foo.__proto__===Function.protype;
Foo.prototype===Foo.prototype;
var foo1=new Foo();
var foo2=new Foo();
foo1.__proto__===foo2.__proto__;
foo1.__proto__===Foo.prototype;

任何一个函数的prototype都是一个Object。所以它们本身也有__proto__属性。
总结以上内容,对于__proto__

  • 所有js对象都有__proto__
  • __proto__指向当前对象的构原型,也就是申明函数是产生的函数.prototype。(函数对象本身也符合这个规则,它的申明函数原型是Function.prototype)
  • 函数.prototype本身也是对象,所以它的__proto__也存在。所有非Object函数函数.prototype__proto__都是Object.prototype。而Object.prototype__proto__null
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容