Javascript是一門很靈活的語言,允許我們模擬面向對象編程中的很多機機制。在JS中充分使用面向對象設計思想,可以極大限度的提升代碼重用、降低模塊間的偶合、更好的邏輯分層與並行開發。下面分幾個步驟簡單談下我的理解。
一、數據類型與包裝類
包裝類 …… 類型名 …… 常見值 …… 分類
Number …… number …… 123.123 …… 基本數據類型
Boolean …… Boolean …… true、false …… 基本數據類型
String …… string …… “hello world!” …… 基本數據類型
Object …… object …… {}、[] …… 復合數據類型
Function …… function …… function(){} …… 特殊類型
無 …… undefined …… undefined、未定義 …… 小數據類型
無 …… null …… null …… 小數據類型
內置類型與本文關系不大,不列出。
二、引用類型與值類型
引用類型:object function
值類型:number、boolean、string、null、undefined
三、new function(構造器)與prototype(原型)
關於prototype的設計模式就不多說了,網上很多介紹,以一個例子介紹一下js中使用new構造對象的過程。
function classname(){this.id=0;} var v=new classname();
當使用function構造對象時,進行以下流程:
1、 查找classname的prototype,並進行淺拷貝。
2、 綁定this指針到拷貝來的對象。
3、 將this.constructor屬性設置為classname。
[注:其實classname.prototype.constructor的值也被設置為classname,第六部分會說明]
4、 執行用戶{}中的代碼。
5、 返回this指針賦予左值v。
四、實現面向對象的三個基本特征
1、 封裝
封裝這個大家都明白,在js中,重點在於訪問權限。在其他原生支持面向對象語言中,一般支持public、protected、private三個關鍵字來控制訪問權限,但在js中,我們只能依靠復雜的作用域關系來控制:
function classname(a){
var uid=a; //uin為模擬private,作用域為{},外部無法使用
this.getuid=function(){return a;} //為uid提供一個外部只讀接口 obj.getuid();
this.setuid=function(val){a=val} //為uid提供一個外部可寫接口obj.setuid(5);
this.id=uid; //id為模擬public obj.id 使用
}
classname.prototype.func=function(){}; //模擬public方法 obj.func()調用
classname.stafunc=fun