Javascript語言的面向對象特徵很弱,其他面嚮對象語言在創建類時只要使用關鍵字static即可指定類爲靜態類,Javascript沒有提供static這樣的關鍵字,要讓Javascript也具有“靜態”特性只有靠一些“奇技淫巧”了。
代碼中列舉了兩種靜態方法/屬性的實現方式,一種是靜態類的靜態方法和屬性,另一種是非靜態類的靜態方法和屬性,代碼說明都寫在每行的代碼註釋裏,這裏就不重複了。
/****************************************
* 方法一
* 類、方法、屬性都爲靜態類型
* 不能創建實例
*****************************************/
var Time = {
today: ‘2009-3-8′,
weather: ‘rain’,
show: function() {
alert(‘Today is ‘ + this.today);
}
};
//靜態對象可直接使用,無需創建實例
alert(‘It is ‘ + Time.weather + ‘ today.’);
Time.show();
//下面的代碼會出錯,因爲靜態類不能創建實例
//var t = new Time();
//t.show();
/****************************************
* 方法二
* 普通對象,同時擁有靜態和非靜態屬性、方法
* 可以用實例化
* 注意:
* 1.靜態方法/屬性使用類名訪問
* 2.非靜態方法/屬性使用實例名訪問
*****************************************/
function Person(name) {
//非靜態屬性
this.name = name;
//非靜態方法
this.show = function() {
alert(‘My name is ‘ + this.name + ‘.’);
}
}
//添加靜態屬性,人都是一張嘴
Person.mouth = 1;
//添加靜態方法,哇哇大哭
Person.cry = function() {
alert(‘Wa wa wa …’);
};
//使用prototype關鍵字添加非靜態屬性,每個人的牙可能不一樣多
Person.prototype.teeth = 32;
//非靜態方法必須通過類的實例來訪問
var me = new Person(‘Zhangsan’);
//使用非靜態方法、屬性
me.show();
alert(‘I have ‘ + me.teeth + ‘ teeth.’);
//使用靜態方法、屬性
Person.cry();
alert(‘I have ‘ + Person.mouth + ‘ mouth.’);
//
var p=new Person("x"); alert(p.mouth);//回顯示未定義 p.cry();//會顯示Uncaught TypeError: Object #<Person> has no method 'cry'
可以發現,實例對象沒法訪問類的靜態方法和屬性。需要訪問只能使用類名
<span style="color:#333333;">function Person(name){
this.name=name;
this.show=function(){
alert("My Name is "+this.name);
};
};
Person.mouth=1;
Person.cry=function(){
alert("wa wa");
}
Person.prototype.teeth=32;
var p=new Person("x");
alert(Person["mouth"]);//1
p["show"]();//My name is x</span>
在Jquery中可以這樣使用對象的靜態方法和屬性:
var arr=new Array();
arr["push"]("x");
alert(arr["length"]);//1
歡迎大家補充討論,共同進步!