Javascript是一門很靈活的語言允許我們模擬面向對象編程中的很多機機制在JS中充分使用面向對象設計思想可以極大限度的提升代碼重用降低模塊間的偶合更好的邏輯分層與並行開發下面分幾個步驟簡單談下我的理解
一數據類型與包裝類
包裝類 …… 類型名 …… 常見值 …… 分類
Number …… number …… …… 基本數據類型
Boolean …… Boolean …… truefalse …… 基本數據類型
String …… string …… “hello world!” …… 基本數據類型
Object …… object …… {}[] …… 復合數據類型
Function …… function …… function(){} …… 特殊類型
無 …… undefined …… undefined未定義 …… 小數據類型
無 …… null …… null …… 小數據類型
內置類型與本文關系不大不列出
二引用類型與值類型
引用類型object function
值類型numberbooleanstringnullundefined
三new function(構造器)與prototype(原型)
關於prototype的設計模式就不多說了網上很多介紹以一個例子介紹一下js中使用new構造對象的過程
function classname(){thisid=;} var v=new classname();
當使用function構造對象時進行以下流程
查找classname的prototype並進行淺拷貝
綁定this指針到拷貝來的對象
將thisconstructor屬性設置為classname
[注其實classnameprototypeconstructor的值也被設置為classname第六部分會說明]
執行用戶{}中的代碼
返回this指針賦予左值v
四實現面向對象的三個基本特征
封裝
封裝這個大家都明白在js中重點在於訪問權限在其他原生支持面向對象語言中一般支持publicprotectedprivate三個關鍵字來控制訪問權限但在js中我們只能依靠復雜的作用域關系來控制
function classname(a){
var uid=a; //uin為模擬private作用域為{}外部無法使用
thisgetuid=function(){return a;} //為uid提供一個外部只讀接口 objgetuid();
thissetuid=function(val){a=val} //為uid提供一個外部可寫接口objsetuid();
thisid=uid; //id為模擬public objid 使用
}
classnameprototypefunc=function(){}; //模擬public方法 objfunc()調用
classnamestafunc=function(){}; //模擬靜態方法 classnamestafunc()調用
var obj=new classname();
[!]非常需要注意的就是因為function是引用類型 classnameprototypefunc是所有對象共享的一個function對象(每個對象僅存著引用)因此對象規模不大而使用thisgetuid和thissetuid為定義一個function因此每個對象實例都會存一份如果放肆使用這種方法會造成對象規模龐大影響性能個人認為模擬private變量的意義不大
[!]如果有需求真的需要大量使用thisxxx=function(){}這種情況在function(){}中的this指針與最外的this指針是不同的最好在類定義的首行加上var _this=this;這樣在thisxxx=function(){}中也可以方便使用綁定的指針
繼承
繼承的實現主要有種方法第一種是使用javascript本身的原型模型通過給prototype賦值並改變其constructor屬性來實現繼承第二種方法是不使用prototype手動實現將父對象的所有屬性方法深拷貝到子對象比如A需要繼承B第一種寫法可以Aprototype=new B();Aprototypeconstructor=A; 第二種寫法可以寫一個遞歸或者使用jquery中的方法extend另外如果要實現多繼承的話prototype就真的好麻煩了(需要依次多個類還要建空對象來接)第二種方法就比較簡單依次拷貝即可一般這種繼承為了找父類方便可以在對象中加個屬性引用父類
多態
函數重載就不說了都會檢查參數即可很靈活隱藏屬性就是直接賦值undefined需要注意的是如果是打算繼承B類的prototype一定要建一個空對象來接否則的話你給類寫方法的話相當於直接修改了prototype就算不寫方法你最後修改constructor時也會造成繼承鏈錯亂接個空對象很容易
function temp(){};
tempprototype=B;
var obj=new temp();
這樣再讓需要繼承Bprototype的類繼承obj即可即便修改prototype也不會影響到B而且也不像繼承new B()那樣浪費很多空間
五深拷貝與淺拷貝
這個和其他語言中沒什麼區別淺拷貝就是直接拷貝遇到引用類型或類類型不再深入深拷貝則是根據類型判斷進行遞歸拷貝
六prototypeconstructor
這個值主要是用於維護繼承的原型鏈一篇文章已經寫的非常詳細請參考
七JS的面向對象開發
由於我不是前台開發人員見過項目有限僅談自己的經驗
我開發過的
B/S常用兩種架構
一種是以
CGI為主
由後台語言去生成
HTMLJS僅僅做一些用戶交互
ajax通信等
另外一種是使用
MVC後台語言僅僅生成
JSONView層完全由
JS組件在客戶端實現
後者一般大量使用面向對象的思想進行編程
將組件封裝成類
將
JSON傳入構造函數
再由控制器或布局組件
Add進來
由於組件可以重用
在開發後台管理系統
JS游戲上
效率還是很可觀的
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20281.html