老魚 淺談javascript面向對象編程
2024-05-06 14:11:16
供稿:網友
感嘆是為了緩解嚴肅的氣氛并引出今天要講的話題,”javascript面向對象編程”,接下來,我們圍繞面向對象的幾大關鍵字:封裝,繼承,多態,展開。
封裝:javascript中創建對象的模式中,個人認為通過閉包才算的上是真正意義上的封裝,所以首先我們先來簡單介紹一下閉包,看下面這個例子:
代碼如下:
<script type="text/javascript">// <![CDATA[
function myInfo(){
var name ="老魚",age =27;
var myInfo = "my name is" + name + "i am" + age +"years old";
function showInfo(){
alert(myInfo);
}
return showInfo;
}
var oldFish = myInfo();
oldFish();
// ]]></script>
是不是很眼熟呢?沒錯了,這其實就是一個簡單的閉包應用了。簡單解釋一下:上面的函數myInfo中定義的變量,在它的內嵌函數showInfo中是可訪問的(這個很好理解),但是當我們把這個內嵌函數的返回引用賦值給一個變量oldFish,這個時候函數showInfo是在myInfo函數體外被調用,但是同樣可以訪問到定義在函數體內的變量。oh yeah!
總結一下閉包的原理吧:函數是運行在定義他們的作用域中而不是調用他們的作用域中。其實返回一個內嵌函數也是創建閉包最常用的一種方法!
如果覺得上面的解釋太抽象的話,那么我們一起重塑上面的函數,看看這樣是否層次鮮明一些:
代碼如下:<script type="text/javascript">// <![CDATA[
var ioldFish = function(name,age){
var name = name,age = age;
var myInfo = "my name is" + name + "i am" + age +"years old";
return{
showInfo:function(){
alert(myInfo);
}
}
}
ioldFish("老魚",27).showInfo();
// ]]></script>
上例中的編碼風格是ext yui中比較常見的,公私分明,一目了然。通過閉包,我們可以很方便的把一些不希望被外部直接訪問到的東西隱藏起來,你要訪問函數內定義的變量,只能通過特定的方法才可以訪問的到,直接從外部訪問是訪問不到的,寫的挺累,饒了一圈終于轉回來了,封裝嘛,不就是把不希望被別人看到的東西隱藏起來嘛!哈哈……
上例如果轉換成JQ的風格的話,應該如下例所寫, 這樣的封裝模式屬于門戶大開型模式,里面定義的變量是可以被外部訪問到的(下面的例子如果你先實例化一個對象,然后在函數外部訪問對象的name或者age屬性都是可以讀取到的)當然這種模式下我們可以設置一些”潛規則”,讓團隊開發成員明白哪些變量是私用的,通常我們人為的在私有變量和方法前加下劃線”_”,標識警戒訊號!從而實現”封裝”!
代碼如下:<script type="text/javascript">// <![CDATA[
var ioldFish = function(name,age){
return ioldFish.func.init(name,age);
};
ioldFish.func = ioldFish.prototype ={
init:function(name,age){