JS 中一切皆为对象,大致分两类:普通对象(object)和函数对象(function)
除了定义的函数以外,所有的构造函数也是函数对象如 Function、Object、Number 等
function Fun () {}
Fun.prototype.name = 'Fun'
Fun.prototype.getName = function () {}
let f = new Fun()
f.name === Fun.prototype.name
f.getName === Fun.prototype.getName
Fun.prototype.constructor === Fun
let obj = {}
obj.__proto__ === Object.prototype
f.__proto__ === Fun.prototype
Fun.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
Fun.prototype.__proto__ === Object.prototype
Function.prototype.__proto__ === Object.prototype
// Object.prototype.__proto__ 比较特殊,到达原型链终点
Object.prototype.__proto__ === null
// Function.__proto__ 比较特殊
Function.__proto__ === Function.prototype
在使用 new 方法实例化一个函数对象的时候,得到的新对象的__proto__会指向函数对象的原型对象,如果该函数对象又继承自另一函数对象,那么该函数对象的原型对象的__proto__又指向另一函数的原型对象……最终,某一函数对象的原型对象的__proto__会指向 Object 的原型对象,而 Object 的原型对象的__proto__指向 null,整个链形成了一条原型链