搞了半天,原来原型和原型链就类似于 c++中的继承与派生,这个懂了就很好理解了。
先定义:原型 每个对象都有一个方法,叫做隐式原型(原型),就是所谓的原型,原型就是指向其类的指针。目的就是为了方便对象自身找不到方法或属性的时候找父类的对象和方法。
现在通俗理解: 对象找方法/属性,自身没有,找不到,但是又要调用,就会去原型中寻找,(就是父类中寻找),原型就是指向父类的指针,找到了就调用。
举个例子:teacher中有两个属性、(name和subject),表示的是老师的名字和所教授的课程,但是现在teacher需要调用一个teach方法(teacher.teach),
好家伙,自身没有,怎么办,去原型里找,就是看父类(Teacher)里有没有。好家伙,Teacher类中有,所以就可以调用。打印出teacher.teach
再来个图!
再来原型链: 现在应该好理解了,原型链就是,找父类中的方法,没找到,但是父类中还有原型,再去找它的父类(Teacher的原型),好家伙,找到了,那就和原型一样调用,
但是访问了两次原型,所以就叫原型的原型,原型链。
举例:现在老师要喝水,怎么办?
teacher.drink();
teacher只能找了,看自身有没有喝水这个方法,好家伙没有!teacher对象中没有
那咱们去原型找(__proto__),去父类找,好家伙,又没有!! 现在我们找到了 Teacher 这个类,还是没有
那去原型的原型找,(__proto__.__proto__),父类的父类,好家伙,嘿嘿,找到了! 现在我们来到了Person这个类,它有!
那我们现在 就可以调用了! 这一顿操作下来,就是原型链!!!
有可爱的同学就要问了,那如果teacher要调用xxx方法/属性,但是都找了,都没找到呢?
那这个时候,既然已经找到原型的原型了,还是没有找到,那我们也没办法了,说明它真的不能调用这个属性和方法。
我们就返回null
上图!
有小伙伴就问了,那如果还没找到呢,
那就返回null了。