Javascript语言可能太过灵活,导致一些学C#学Java等姑且说叫"正统的面向对象的语言"的人觉得Javascript面向对象的部分凌乱不堪,上网看别人对原型和原型链的理解都是各抒己见,各有各的道理,自己的一番说辞只要自己能辩证通了,那么倒说的过去,至少自己思考过了...
说一下我个人对Javascript中"原型"和"原型链"的理解吧,首先:
1.什么是"原型"呢?
脑子里第一反应的是设计模式中的"原型模式",将一个具体的对象作为原型,拷贝出跟他相同的对象,当然还有"深复制"和"浅复制"跟这无关了,不做讨论...OK,那么我们大概的先得出原型实际上是一个"对象",再通过借鉴别人的理解,几乎可以肯定了,"原型"确实是一个"对象",通过这个对象来拷贝得到别的对象...
那么我们通过代码来说事吧
//创建一个Person类,给个默认属性默认值
function myPerson(){this.name="崔永航";};
myPerson.prototype //这里直接在浏览器Console控制台得到myPerson{ }对象
//我们再实例化一个myPerson对象
var myPer = new myPerson();
myPer.__proto__ //这里也在浏览器Console控制台得到myPerson{ }对象
我们发现myPerson构造器的prototype的属性指向myPerson{ }对象,而myPer.__proto__也指向myPerson{ }对象,他们为什么指向同一个呢?我画了个图如下
实际上我们对象的__proto__属性指向的是构造器或者说是类的prototype属性,而这个类的prototype属性指向谁,那么在构造这个对象的时候就会将被构造对象的__proto__的属性指针指向谁,仅限在实例化时,当对象构造完成之后再去更改构造器的prototype属性指向的对象,仅会对后继的对象产生影响...那么原型实际上就是当前类对象的__proto__属性指向的构造器的prototype属性所指向的对象,这个对象一般指向父类...
2.那么什么是"原型链"呢?
图中右上角也有说明...子类的__proto__指向构造器的prototype属性指向的对象,然后这个对想的__proto__属性又继续指向他的构造器的prototype属性指向的对象,如此循环,最后指向Object,而Object的原型指向null,原型链结束...