JavaScript如何?“物件導向”的各種特徵
JavaScript是一種基於對象的語言,只能使用系統提供的內建對象。如何才能用JavaScript寫出象物件導向語言一樣的代碼呢?下面我就給大家說說我的方法。
1、定義一個類(class & field)
//***********code begin***********
//定義類
function MyClass()
{
this.field1; //定義類的成員
this.field2;
}
var obj = new MyClass(); //調用類
obj.aa = 1; //訪問成員
obj = null; //釋放對象
//***********code end***********
2、定義類的方法(method)
//***********code begin***********
function MyClass()
{
this.method1 = _func1;
this.method2 = _func2;
//函數
function _func1(aa)
{
//code here
}
}
function _func2(aa,bb) //外部函數
{
//code here
}
var obj = new MyClass(); //調用類
obj.method1("參數"); //調用方法
obj = null; //釋放對象
//***********code end***********
注意:a.把一個函數綁定到方法的時候,不能加參數和括弧;
b.綁定為方法的函數可以在類的外部或內部(當然,在別的檔案中也行)
3、屬性(Property)
抱歉,JavaScript不能實現象C#中的屬性那樣的效果,定義的方法和資料成員都是公有的。
但是,我們可以用方法來訪問屬性。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.getData = _func1;
this.setData = _func2;
//擷取成員
function _func1()
{
return privateData;
}
//設定成員
function _func2(value)
{
privateData = value;
}
}
var obj = new MyClass(); //調用類
obj.setData(100);
alert(obj.getData());
obj = null; //釋放對象
//***********code end***********
注意:a.這裡其實是定義一個函數內的局部變數,外部無法訪問,所以,訪問成員的方法也要定義在類裡面。
4、資料成員(public & private)
JavaScript中定義的類中,成員都是可以訪問的,就好像預設加上了public。
如何?成員的私人呢?看了3的例子可能就明白了,在class裡面定義局部變數就能夠使成員私人。
方法的私人也是一樣,只要函數不綁定就行了。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.getData = _func1;
this.setData = _func2;
//擷取成員
function _func1()
{
return privateData;
}
//設定成員
function _func2(value)
{
__privateMethod(); //訪問私人的方法,外部不能訪問
privateData = value;
}
function __privateMethod()
{
privateData = 1000; //私人方法中訪問私人成員
}
}
var obj = new MyClass(); //調用類
obj.setData(100);
obj.getData();
obj = null; //釋放對象
//***********code end***********
注意:a.公有方法中能夠訪問公有的方法和成員,也能訪問私人的方法和成員;但是,私人的方法只能訪問私人的方法和成員。
5、對對象本身的訪問(this)
看了上面一節,朋友們一定發現這樣的問題:私人的方法中如何訪問對象本身?
如果一個函數,沒有採用this.方法名=函數名的格式綁定,那麼函數中使用this將產生錯誤。如何解決呢?
//***********code begin***********
function MyClass()
{
var me = this; //注意這裡,將對象本身引用到另外一個對象。
var privateData = 0;
this.publicData;
this.getData = _func1;
this.setData = _func2;
//擷取成員
function _func1()
{
return privateData;
}
//設定成員
function _func2(value)
{
this.publicData = 100; //訪問共有的資料成員
__privateMethod(); //訪問私人的方法,外部不能訪問
privateData = value;
}
function __privateMethod()
{
me.publicData = 200; //在私人方法中訪問共有方法
privateData = 1000; //私人方法中訪問私人成員
}
}
var obj = new MyClass(); //調用類
obj.setData(100);
obj.getData();
obj = null; //釋放對象
//***********code end***********
總結:在定義類的時候,將對象本身賦值給一個局部變數,其他函數就能通過訪問這個變數來訪問類了。
6、函數重載(overload)
函數重載能夠通過不同的參數,調用同名的不同函數。JavaScript中也可以,只是要麻煩些:
//***********code begin***********
function func1() //在定義函數的時候可以指定,也可以不指定參數
{
var nArgCount = func1.arguments.length;
switch(nArgCount)
{
case 0: //沒有參數
//code here
break;
case 1: //一個參數
//code here
break;
…………
default:
//code here
break;
}
}
//***********code end***********
注意:a.可惜,我還沒有想出如何根據參數類型而作出判斷的方法。
7、建構函式(Constrcutor)
呵呵,因為類本身就是一個函數,所以把代碼直接寫在函數裡面就相當於建構函式了。
//***********code begin***********
function MyClass()
{
this.publicData;
//下面的代碼相當於建構函式
this.publicData = 123;
alert(this.publicData);
}
var obj = new MyClass(); //調用類
obj = null; //釋放對象
//***********code end***********
注意:建構函式在這裡沒有使用參數,可以結合第6個技巧,做出建構函式參數的效果。
8、自訂事件(event)
JavaScript中,函數本身也是對象,可以直接使用,所以,定義自己的事件也很簡單。
//***********code begin***********
function MyClass()
{
var privateData = 0;
this.setData = _setData;
this.OnDataChange = null;
function _setData(value)
{
privateData = value;
this.OnDataChange(); //引發事件
}
}
function MyEvent()
{
alert("你改變了數值!");
}
var obj = new MyClass(); //調用類
obj.OnDataChange = MyEvent;
obj.setData(1234);
obj = null; //釋放對象
//***********code end***********
9、繼承
使用prototype實現繼承:
function MyClass()
{
this.Property = "value";
this.Method = function(){}
}
var obj = new MyClass();
obj.prototype.Property1 = "value1";
obj.prototype.Method1 = function(){}
好了,以上就是小弟總結出來的技巧,希望對大家有所協助。
同時,我再次也倡議大家:如果多個函數能夠重用,或者解決某個問題能夠重用,那麼就把這些JavaScript的代碼寫成一個類。封裝性好,重用性也好!
*********************************
* 阿福原創 *
* QQ:12304685 *
* mail:ah_fu126@hotmail.com *
*********************************