如何在面试中回答“说说什么是原型和原型链”?

每个对象都会在其内部初始化一个属性,就是prototype(原型)。通俗的说,原型就是一个模板,更准确的说是一个对象模板。

当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。

对于函数而言,只有函数才有 prototype 属性,Person.prototype 是一个对象,并且有两个属性, 一个是 constructor 指向其构造函数 Person, 一个是 __proto__ 属性:是一个对象,指向上一层的原型。

原型链的尽头是Object.prototype。所有对象均从Object.prototype继承属性。

Function.prototype和Function.__proto__为同一对象。Object/Array/String 等等构造函数本质上和 Function 一样,均继承于Function.prototype。

Function.prototype直接继承Object.prototype。

这里的 Object 和 Function 有点鸡和蛋的问题,总结:先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,Function 和 Object 和其它构造函数继承Function.prototype而产生。