原型链图:
image.png
问题1.为什么需要原型及原型链?
先来一个例子:
function Person(name,age){
this.name=name;
this.age=age;
this.eat=function(){
console.log("我叫"+name+",今年"+age+"啦");
}
}
var p1=new Person("jspang",18)
var p2=new Person("jspang",18)
p1.eat();
p2.eat();
console.log(p1.name===p2.name);//true,名字是一样
console.log(p1.eat===p2.eat);//false,但同一个方法不一样
上面代码总结:同一个构造函数实例化的方法是不相等的.
可以看到,对于同一个函数,我们通过 new 生成出来的实例,都会开出新的一块堆区,所以上面代码中 p 1 和 p2 的吃饭是不同的。
拥有属于自己的东西(例如房子、汽车),这样很好。但它也有不好,毕竟总共就那么点地儿(内存),你不停地建房子,到最后是不是没有空地了?(内存不足)
所以,咱要想个法子,建个类似于共享库的对象(例如把楼房建高),这样就可以在需要的时候,调用一个类似共享库的对象(社区),让实例能够沿着某个线索去找到自己归处。
而这个线索,在前端中就是原型链 prototype。
上面代码进行改造:
function Person(name,age){
this.name=name;
this.age=age
}
Person.prototype.eat=function(){
console.log("吃饭");
}
var p1=new Person("jspang",18)
var p2=new Person("jspang",18)
console.log(p1.eat==p1.eat);//ture,原型里的方法相同
总结:原型里的方法相同.
形象的原型链故事图:
image.png
image.png