準備工作:
(一)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/轉載請注明:部落格園