当通过一个构造函数创建一个对象的时候
function Person() {
}
var a = new Person();
该对象都有一个 _ __proto _ __属性,指向它的原型对象(假设叫A),同时构造函数Person也有个prototype属性指向这个原型对象A,这个原型对象A有个constructor属性指向构造函数Person。
即:对象a的_ proto __ 指向构造函数Person的 prototype( 要注意的是这里的 _proto __是依赖构造函数Person的prototype来找到原型对象的,它本身没有直接找到原型对象的能力 ),他们共同指向原型对象A
如下图:
150F472A-3680-43BF-9BA4-3172636018E4.png当读取实例的属性时,如果找不到,就会查找与对象关联的原型对象中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
function Person() {
}
Person.prototype.age = '原型对象中的age';
var a = new Person();
a.name = 'a的name';
console.log(a.name) //输出: a的name
console.log(a.age) // 输出:原型对象中的age
原型对象A也是对象,是对象就可以用构造函数来创建
var A = new Object();
所以原型对象Person.prototype(即A)的 _ _proto __ 指向构造函数的 prototype,共同指向Object.prototype
3.png那 Object.prototype 的原型呢?为null,就是说原型链到Object.prototype 就到头了
最后我用这张图整理一下思路,第二排表示构造函数,第一排表示原型对象,图中原型对象和构造函数之间的constructor和prototype关系省略没画
总结
网友评论