构造函数、实例、原型三者之间的关系

任何函数都具有一个prototype属性,该属性是一个对象。
function F () {}
console.log(F.prototype) // => object

F.prototype.sayHi = function () {
  console.log('hi!')
}

构造函数的prototype对象默认都有一个constructor属性,指向prototype对象所在函数。

console.log(F.constructor === F) // => true

通过构造函数得到的实例对象内部会包含一个指向构造函数的prototype对象的指针_proto_ 。

var instance = new F()
console.log(instance.__proto__ === F.prototype) // => true

__proto__ 是非标准属性。

实例对象介意直接访问原型对象成员。
instance.sayHi() // => hi!

总结:

  • 任何函数都具有一个prototype属性,该属性是一个对象
  • 构造函数的prototype对象默认都有一个constructor属性,指向prototype对象所在函数
  • 通过构造函数得到的实例对象内部会包含一个执行构造函数的prototype对象的指针_proto_
  • 所有实例都直接或间接继承了原型对象的成员