提示:以下是我阅读javascript高级程序设计第四版后个人对原型链关系的一些理解,如有错误之处,还望指出
一、原型链的作用
原型链的基本作用就是属性共享,如果没有原型链,像一些常用的方法例如toString,join这些,每次使用前都得重新定义一遍,当对象实例调用某个属性时会先从自身开始查找,如果没找到就会根据原型链逐级往上查找,直到找到为止
二、new操作符
使用new操作符调用构造函数会执行如下操作
1.在内存中创建一个新对象
2.这个新对象内部的[[prototype]]特性被赋值为构造函数的prototype属性
3.构造函数内的this会被赋值到这个新对象
4.执行函数内部的代码
5.如果构造函数返回非空对象,则返回该对象,否则返回刚创建的新对象
三、构造函数、原型对象、实例对象之间的关系
1.构造函数其实和普通函数只是调用方式不同,任何函数只要通过new关键字调用就是构造 函数
2.无论在什么情况下函数在创建时都会产生一个原型对象(prototype),而原型对象默认都会 拥有constructor属性,constructor指向构造函数
3.实例对象在被创建时都会拥有一个[[prototype]]属性,这个属性的指针指向构造函数的原 型对象([[prototype]]属性没有标准的访问方式,浏览器一般暴露出来的都是__ptoto__)
验证一下我上述所说的
由于user这个实例对象的__proto__属性指向的是Person.prototype,所以给原型对象添加属性时实例对象也可以访问
四、继承
在上面的代码中,构造函数Shop并没有meat这个属性,但由于Shop.prototype实现了对SuperMarket的继承,这次赋值改变了Shop的默认原型,原本Shop.prototype对象里的[[prototype]]属性本该指向Object.prototype,改变为指向SuperMarket的实例,
这代表着Shop的实例可以访问SuperMarket所有的属性