通过一个案例理解原型链
Function.prototype.a = "a";
Object.prototype.b = "b";
function Person(){}
console.log(Person); //function Person()
Person p = new Person();
console.log(p); //Person {} 对象
console.log(p.a); //undefined
console.log(p.b); //b
p是Person()的实例,是一个Person对象,它拥有一个属性值 __ proto __ ,并且__ proto __是一个对象,包含两个属性值constructor和 __ proto __
console.log(p.__proto__.constructor);
console.log(p.__proto__.__proto__);
p. __ proto__.constructor得到的是Person()这个构造函数
p.__ proto __ .__ proto __ .constructor得到拥有多个参数的Object()函数,Person.prototype的隐式原型的构造函数指向Object(),即Person.prototype. __ proto __ .constructor == Object()
总结:
1.查找属性,如果本身没有,则会去proto中查找,也就是构造函数的显式原型中查找,如果构造函数中也没有该属性,因为构造函数也是对象,也有proto,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined
2.p.__ proto __.constructor == function Person(){}
3.p.__proto __.__proto __== Object.prototype
4.p.__proto __.__proto __.__proto __== Object.prototype.__proto __ == null
5.通过__proto __形成原型链而非protrotype
分析图
完整的原型链
Product.prototype={}
var p = new Product();
console.log(p.__proto__ == Product.prototype);
console.log(Product.__proto__ == Function.prototype);
console.log(Function.prototype.__proto__ == Object.prototype);
console.log(Product.prototype.__proto__ == Object.prototype);
console.log(Object.prototype.__proto__ == null);
var kong = {};//Object对象
console.log(kong.__proto__ == Object.prototype);