- 什么是原型?
- 什么是原型链?
面试官大多会这样问你说一下原型和原型量?
1、什么是原型
我会这样回答:
说到原型链就要提到三个属性,proto prototype constructor。
1、proto 和 constructor是对象独有的属性。但proto不是对象自身的属性,而是Object.prototype上的访问器。
2**、prototype是函数特有的属性**,在js中函数也是对象,因此函数也有__proto__和constructor属性
(这两句话的总结尤为重要,接下就具体解释每个属性的作用及关联关系)
proto是对象独有的属性
此处举个栗子。
function Person(){} var p = new Person()
此时在控制台输出p,会看到含有proto属性(当然也有constructor),这个_ _ proto _ _属性将p对象指向另一个对象Object,即指向它的原型对象。
prototype是函数特有的属性
这个属性是函数所独有的。Person构造函数通过prototype属性指向一个对象,这个对象就是函数的原型对象
constructor是对象的属性
constructor指向对象的构造函数。
中间关系同下图所示:
2、什么是原型链?
当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(可以理解为父对象)里找,如果父对象也不存在这个属性,则继续往父对象的__proto__属性所指向的那个对象(可以理解为爷爷对象)里找,如果还没找到,则继续往上找…直到原型链顶端null(可以理解为原始人。。。),再往上找就相当于在null上取值,会报错(可以理解为,再往上就已经不是“人”的范畴了,找不到了,到此结束,null为原型链的终点),由以上这种通过__proto__属性来连接对象直到null的一条链即为我们所谓的原型链。 其实我们平时调用的字符串方法、数组方法、对象方法、函数方法等都是靠__proto__继承而来的。