路线图

可以通过上述路线图来观察。

  • 函数和对象,都有一个__proto__属性,指向它们各自的原型prototype。注意到prototype也是一个对象,所以prototype也有__proto__属性,这样就构成了一个原型链,最高到达Object.prototype.__proto__===null为止。

  • 对于函数而言,它的__proto__指向Function.prototype。因为ObjectFunction本身也是函数,所以Function.__proto__、Object.__proto__、Cat.__proto__实际上是完全相同的,它们都指向同一个对象:Function.prototype

  • 因此,如果我们有:Function.prototype.bark=function(){console.log("Wow!")},那么所有函数都可以按照原型链访问到该方法:Cat.bark()。注意不能写成Function.bark=....,否则需要通过:Cat.constructor.bark()来访问(Cat通过原型链在Functionprototype中找到了constructor,而它指向Function,从而可以引用bark

  • Cat这个自定义函数可知,当函数被编译创建时它就已经有了一个原型对象prototype。而这个原型对象prototype本身不等于Object.prototype,而是它的__proto__属性等于:Cat.prototype.__proto__===Object.prototype

  • 当我们手动改变一个对象的原型时(即改变__proto__指向),注意constructor


Azure_Chien
97 声望1 粉丝