天天看點

javascript 類

準備工作:

(一)js函數

Js函數基本的定義文法為:

function 函數名(arg1,arg2,……)

{}

和通常意義上的函數(方法)相似。可以有傳回值。

例如:

<script>

function noReturnValue()

{    

function hasReturnValue()

{

    return 'ok';

function doClick()

    alert(noReturnValue());

    alert(hasReturnValue());

}

</script>

函數noReturnValue沒有傳回值,是以列印結果為:undefined

hasReturnValue傳回ok字串。

(二)Function對象

ECMAScript有一類對象為:Function對象。它表示定義的任何函數(function)

var function_name = new Function(arg1, arg2, ..., argN, function_body)

示例:

function doClick2()

      var fun = new 

      Function("a1", "alert(a1);");

      fun('ok');

通過Function定義的函數對象,最後一個參數為函數體,前邊的參數。兩部分都以字元串類型存在。通過字元串的定義方式來定義較困難,但它訓示函數是一種引用類型,函數是Function類型的一個執行個體,而函數名而是一個指向函數的變量。

(三)函數類型

可以通過typeof來得到js對象的類型。

示例一(類型):

function doClick3()

    var fun = new Function("a1", "alert(a1);");

    alert("Object:"+typeof (Object) + "\r\n"

    + "Date:" + typeof (Date) + "\r\n"

    + "Array:" + typeof (Array) + "\r\n"

    + "Function:" + typeof (Function) + "\r\n"

    + "new Function():" + typeof (new Function()) + "\r\n"

    + "function:" + typeof (fun) + "\r\n"

    + "new Date():" + typeof (new Date()) + "\r\n"

    + "new Array():" + typeof (new Array()) + "\r\n"

    + "new Object():" + typeof (new Object()) + "\r\n"

    );

對于對象來說它們的類型做為一種函數存在;建立完的對象除Function外,做為對象類型(object)存在。

示例二(構造方法):

function doClick4()

    alert(fun.constructor); 

    var obj = new Array();

    alert(obj.constructor); 

    var i = 0;

    alert(i.constructor);

    var num = new Number();

    alert(num.constructor);

列印的内容除第一個外都是以function 函數名(){}。那麼這些對象都是通過function定義的函數對象。函數對象可以構造對象。

而函數對象的構造方法為:

function Function(){

[native code]

示例三(函數對象構造對象):

function doClick5()

    var no = new Number();

    alert("對象類型:" + typeof (no) + "\r\n構造方法:" + no.constructor); 

    alert("對象類型:" + typeof (hasReturnValue) + "\r\n構造方法:" + hasReturnValue.constructor);

    var conobj = hasReturnValue();

    alert("對象類型:" + typeof (conobj) + "\r\n構造方法:" + conobj.constructor); 

    var fun = new Function("a1", "");

    var mess1 = new fun('ok');

    alert(typeof (fun));

    alert(typeof (mess1));

    alert(mess1.constructor);

No是一個對象;hasReturnValue是一個函數對象;fun是一個函數對象。函數對象可以構造對象,是以可以有:

var conobj = hasReturnValue();

var mess1 = new fun('ok');

類定義

在java、c#中,類可以存放資料,其中最基本的類型有屬性、方法、域。在js中建立(js)類有相似的功能,它的類強調的是一種複合類型。它允許通過變量名進行讀取(例如js函數名可做為變量名使用)。而進行通路時,通過鍵對值方式進行。在C#中,通路屬性其實也是這樣的,例如,Customer類有公有的Name屬性性,其中Name屬性有讀寫兩個屬性器。假設Name屬性為靜态屬性,則可以通過Customer.Name來通路,指派或得到值。從大的方面講,是一種以KV對方式進行通路。

(一)   以大括号方式定義

var customer = {};

var product = 

    name:'mp3',

    price:0

};

    alert(typeof (customer));

    alert(typeof (product));

    alert(typeof (Date));

定義了兩個js類:customer和product。通過測試它們的類型(typeof),它們做為一種object類型存在。那麼它們不可以通過new方式建立(函數對象可以建立對象,例如Date)。

(二)函數對象

函數對象可以建立對象,那麼可以通過function來模拟類類型。

function user()

    this.username = '';

    userage = 0;

    alert(typeof (user));

    var user1 = new user();

    user1.username = "宋江";

    alert(user1.username);

這裡定義了一個user類(函數)

在doClick事件(函數)中,可以得到user的類型為function,它可以用于建立對象,并可以通路。在user類中,有兩個屬性(也可以看做是域),其中username通過this關鍵字定義,userage是直接定義。建立完user對象後,即user1,可以通路username和userage

var user1 = new user();

user1.username = "宋江";

alert(user1.username);

示例二(為類添加函數):

    this.showMessage = function()

    {

        alert('user類的函數');

    }

    user1.showMessage();

對于類中的函數來說,有私有和公有通路性。通過var定義的為私有函數,通過this定義的為公有函數。

示例三(屬性定義與函數定義):

在通過function定義類類型時,其中的屬性(差別類中的函數)可以通過三種修飾符進行,如下:

function clsProperty()

    p1 = 1;

    var p2 = 2;

    this.p3 = 3;

    var cls = new clsProperty(); 

    alert(cls.p1);

    alert(cls.p2);

    alert(cls.p3); 

    cls.p1 = 1;

    cls.p2 = 2;

    cls.p3 = 3; 

    clsProperty.p1 = 1;

    clsProperty.p2 = 2;

    clsProperty.p3 = 3;    

    alert(clsProperty.p1);

    alert(clsProperty.p2);

    alert(clsProperty.p3);

三種修飾中在添加this關鍵字時,具有良好的通路支援,但無修飾或var修飾時,不可以進行操作。Var是用于定義局部變量的關鍵字。在定義屬性時,可以把它了解為私有通路修飾符,而this則可以了解為公有通路修飾符。

function clsProperty1()

    p1 = function() { alert('p1'); };

    var p2 = function() { alert('p2'); };

    this.p3 = function() { alert('p3'); };

    var cls = new clsProperty1(); 

    cls.p1();

    cls.p2();

    cls.p3(); 

    clsProperty1.p1();

    clsProperty1.p2();

    clsProperty1.p3();

P1為無修飾符,p2為var修改符,p3為this修飾符。在doClick5中,cls.p3()和clsProperty1.p2()可以通路。是以,對于js類中的函數來講:

Var修飾符類似C#中的靜态方法(函數)修飾符;this類似執行個體方法(函數)修飾符。

是以對于js類中的屬性來講,也可以把var和this修飾符做為相似的比較:

Var修飾符用于私有屬性修飾符;this類似公有屬性修飾符。

(三)js類中的靜态實作

user.age = 30;

user.showAge = function() { alert(user.age); } 

    user.showAge();

    user.age = 20;

通過在類外進行設定,可以用于靜态通路。

(四)js類中的執行個體實作

在上一篇中,通過this關鍵字實作執行個體屬性和執行個體方法(函數)。還有一種通過prototype關鍵字實作。

user.showAge = function() { alert(user.age); }

user.prototype.showMessage = function()

    alert('執行個體方法');

function doClick1()

    user1.showMessage();    

(五)構造方法

以上的例子中,建立類,構造方法都是無參數的。

下邊是個帶參數的:

function product(id, name, price)

    this.id = id;

    this.name = name;

    this.price = price;

在調用進,分為兩種情況:

情況一:正好符合參數個數,正常調用;情況二:少參數,則從左到右比對,沒有比對的為未定義;情況三:多參數,按正常比對。

    this.getString = function()

        return("id:"+this.id+" name:"+this.name+" price:"+this.price);

    var pro1 = new product(1,'mp3',100);

    alert(pro1.getString()); 

    var pro2 = new product();

    alert(pro2.getString()); 

    var pro3 = new product(1);

    alert(pro3.getString()); 

    var pro4 = new product(1, 'mp3');

    alert(pro4.getString());

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明:部落格園