1.基本所有的函数都有原型[prototype],除了Function.prototype.bind()之外.
let func1 = Function.prototype.bind()
如果用上述方法创建一个函数fun,这个函数fun是不包含属性prototype的
2.每个对象都有[[prototype]]属性,该属性指向其构造函数的原型。
原理图.png
注:[[prototype]]是对象内部的属性,无法外部访问,图中的
__proto__
其实就是指代[[prototype]],在某些浏览器可以使用该属性__proto__
访问到内部属性[[prototype]],下文说的[[prototype]]
都是对应的图中的__proto__
如图所示。f1拥有属性[[prototype]]
,Foo是f1的构造函数。图中所示,f1的[[prototype]]属性指向的是Foo的原型。也就是Foo.prototype。而Foo.prototype就是构造函数本身。再往深一层,Foo.prototype本身也是个函数。那么他的[[prototype]]属性指向什么呢?图中可以看到,他的[[prototype]]属性指向的是Object.prototype。也就是Object的原型。一次类推,Object的[[prototype]]指向null.原型链就到头了。这里可以看出来,函数和对象通过[[prototype]]是会产生一种链式关系,我们称之为原型链,有了原型链,那么顶层的函数或对象就可以访问到底层的对象或方法。类似于java里面的继承。
网友评论