原型及原型链 是 JavaScript 为了实现 继承 所设计的一种机制,即所有对象都存在 __proto__ 属性指向其构造函数的 prototype 属性,当对象需要使用某种属性和方法时,对象本身不存在时就会向其 obj.__proto__ 上查找,即构造函数所实例化的所有对象都共享其构造函数.prototype 对象中的属性,如果还不存在,就进一步向上查找 构造函数.prototype.__proto__ 指向的的构造函数.prototype 的构造函数的prototype 中的属性,没找到的话就继续向上查找,查找到原型链尽头为止
普通的实例对象都是由构造函数实例化生成的,而 Function.prototype 对象是由 Object 实例化生成的,所以 Function.prototype.__proto__ 指向 Object.prototype, 即 person.__proto__ === Person.prototype,而 Object.prototype.__proto__ 指向 null
将属于实例化对象特有的属性写在 构造函数中, 将属于实例化对象共有的属性写在 构造函数.prototype 中
所有函数的默认原型 prototype 都是 Object 原生构造函数的实例化对象,因此 person.__proto__.__proto__ === Person.prototype.__proto__ === Object.prototype
instanceof 用于检测右侧构造函数的原型对象是否在左侧实例对象的原型链上