我们先来看一个函数。
function person() {
}
这个函数我们使用chrome观察其运行情况,可以看到Person有两个属性,一个是prototype,一个是__proto__
。其中prototype是每个函数(只有函数才有这个属性)的属性。而__proto__是js对象的属性,即只要是js对象,都有这个属性。比如
var arr = [],var obj = {}等等,都有__proto__。
如下图所示:
那prototype有什么作用呢?
new 关键字和Person构造器创建的所有的对象都共享prototype上的属性。比如
function person() {
}
person.prototype.name='共享名称';
var p = new Person();
var p1 = new Person();
p.name === p1.name //值为true。
这正是原型的意义所在。
那__proto__有什么用呢?
我们继续使用上面的代码做说明:
如果我们调用p.age,那么js就会在p1对象上查找age变量是否存在,如果p对象上不存在该属性,js就会在
p.__proto__属性指向的Person.prototype(p.__proto__===Person.prototype //值为true)上查找,如果Person.prototype上找不到属性,js就会在Person.prototype.__prototype__属性指向的Object.prototype属性上查找。如果该属性上也查找不到,那么p.age值就会为undefined。
通过这个例子应该清楚了__protype__的作用了:正是__prototype__构成了原型链。上面所面试的原型的指向是否正确,可以通过下图得到验证: