從純粹的物件導向思想(Java思想)向Javascript語言物件導向思想的轉化,經曆沉痛而慘烈。Javascript中對象和類的概念轉化悄然不動聲色,讓人迷糊。有時候,對Java理解得越清楚,對Javascript理解起來就越費勁。尤其對Javascript的原型對象的理解頗費功夫。
按照定義,每個javascript對象都有一個原型對象(簡稱原型),這個原型是由該對象的建構函式所定義(javascript自動建立的),並且對象繼承原型的所有屬性和方法(函數),比如 一個String對象 的原型為 String.prototype ,如果我們想要給String類添加方法,可以這樣做(比如添加常用的trim()方法):
js 代碼
- String.prototype.trim = function (){
- return this.replace(/(^/s*)|(/s*$)/g, "");
- }
這個特性是相當令人驚訝的,因為這破壞了封裝性,就好像在Java中你可以對String類直接進行修改一樣。function() 可以當作資料來給左運算元賦值(而不僅僅是當作動作),也跟Java非常地不同。
對於Javascript內部類都可以這麼改,對於自訂類當然可以這麼改,如:
js 代碼
- function Circle(x,y,r){
- this.x = x;
- this.y = y;
- this.r = r;
- //this.prototype = null ; /*這句代碼可以看作是隱含存在的,因為javascript 中“類”的定義和函數的定義結構上沒有差異,所以可以說,所有函數都隱藏有這樣一個屬性。*/
- }
然後,我們給原型加一個得到面積的方法:
- Circle.prototype.area = function(){
- return this.r * this.r * 3.14159 ;
- }
可以這樣使用:
js 代碼
- var circ = new Circle(0,0,2) ;
- alert(circ.area()) ;
當然,我們也可以在類中很輕鬆的定義我們想要實現的方法,如,還是上面那個求圓面積:
js 代碼
- function Circle(x,y,r){
- this.x = x;
- this.y = y;
- this.r = r ;
- this.area = function (){
- return this.r * this.r * 3.14159 ;
- }
- }
- //調用:
- var circ = new Circle(0,0,2) ;
- alert(circ.area()) ;
兩者的調用代碼完全一樣,那為什麼要使用原型呢?我感覺主要是為瞭解決對內部類型的繼承問題,也就是說當你無法修改String的建構函式而想要讓所有String執行個體都具有某一方法的時候,你可以用這個prototype;或者說,你用這個prototype來類比實現String類的子類,達到對父類進行擴充的目的。
http://metaphy.javaeye.com/blog/91665(原部落格)