javascript与其他面向对象语言有很大的不同,我有时总感觉如果没学过c++,.net而直接开始学javascript反而会更好一些,反之看到javascript的某些特性,你一定会惊呼:居然还有这种操作!
首先推荐一篇不错的文章https://javascriptweblog.wordpress.com/2010/06/07/understanding-javascript-prototypes/
这篇文章有中文翻译,而且翻译水平相当不错http://www.oschina.net/translate/understanding-javascript-prototypes
高手写文章总是点到为止,对于我们这些初学者就需要多琢磨才能真正理解其中的精妙
下面我就来亲自剖析一下其中的一个例子,以下操作直接在google chrome的console里完成。
原文中有一个例子,声明了一个计算圆的面积的类Circle。
var Circle = function(radius){
this.radius = radius;
}
这个对象只是声明了一个属性radius,而并没有怎么计算面积的函数。
然后先让我们创建一个此函数的实例,取名为a.
var a = new Circle(3);
这时候我们看看直接在console里检查一下a的内容:
再看看a从Circle中继承了什么
这时候我们在所谓的基类Circle中增加一个计算面积的方法area
Circle.protype.area = function(){
return Math.PI*this.radius*this.radius;
}
请注意,这个方法area是在声明了实例a之后添加的,然后这时候我们再来检查一下a的内容
a的内容没有变化,再看看a从Circle中继承了什么
奇迹发生了,a中多了一个方法area,尽管这个方法是在a被声明之后才加入到其基类Circle中的,所以在调用a.area()时毫无意外的得到了半径为3的园的面积
哎,即使对于我这种偶尔用用C++的人来说,也只能感慨:居然还有这种操作。
本文系本人原创,如要转载请注明出处。