原型链是实例对象与原型之间的链接
- 要点1
请看以下代码,思考这样一个问题“bb是否会被打印出来?为什么?
function Person(){ this.name = "小明"; } Person.prototype.showName = function(){ alert(this.name); } var bb = new Person(); bb.showName(); 答案是bb会弹出小明。 Person.prototype也是一个对象,只是这个对象比较特殊,叫“原型对象”。然后我们在原型对象Person.prototype上挂载了showName这个方法。 bb是构造函数Person实例化的一个新对象。然而bb上为什么也有showName方法呢? ------因为实例对象bb与原型对象Person.prototype之间存在一个隐式链接。这个隐式链接就是**__proto__**原型链。 bb自身是木有showName方法的,但这并不能阻止bb的脚部,因为它有**__proto__**原型链,当bb在自身的方法中找不到showName时,就会通过它与生具有的**__proto__**原型链继续查找它的原型对象Person.prototype,通过原型链,实例化对象bb也可以拥有原型对象Person.prototype上的方法了。 总结: 每一个构造函数上都有一个prototype属性,每一个对象,包括被实例出来的对象都有一个**__proto__**属性,他们的指向都是一致的。- 要点2
function Aaa(){ this.num = 20; } Aaa.prototype.num = 10; var bb = new Aaa(); alert(bb.num);//20 为什么弹出的是20而不是10呢? ——这里有两个num,Aaa自身有num属性,bb是其实例化出来的对象,所以bb自身也有num属性,就没有必要到原型对象上去找了。 总结: 函数对象自身的属性相当于css加中的行内样式style,而其原型对象上的属性相当于css中加的class样式。style优先级高于class,自身的属性优先于原型对象上挂载的属性。当函数自身有相应的方法或者属性时就用自己的,当自身没有时才通过_proto_原型链查找。
- 要点3 原型链的最外层是Object.prototype
function Aaa(){ // this.num = 20; } // Aaa.prototype.num = 10; Object.prototype.num = 30; var a1= new Aaa(); alert(a1.num);//30当函数对象自身和其原型上都找不到对应的属性或方法时就继续通过原型链_proto_往Object上查找。
