用JAVASCRIPT實現靜態對象、靜態方法和靜態屬性,javascript靜態

來源:互聯網
上載者:User

用JAVASCRIPT實現靜態對象、靜態方法和靜態屬性,javascript靜態

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"]);//1p["show"]();//My name is x</span>



在Jquery中可以這樣使用對象的靜態方法和屬性:
 
var arr=new Array();arr["push"]("x");alert(arr["length"]);//1
歡迎大家補充討論,共同進步!





(javascript)靜態範圍並非靜態,怎理解?

alternate()方法是sayHi()的一個子方法,其實這樣說也不對,應該是屬性才對。

javascript)靜態範圍並非靜態,如何理解啊?
想想:
雖然很多書上說javascript沒有以象之說,其實歸根到底,javascript還是少不了對象的存在,比如說window對象等等,它都是封裝了某一領域的範圍,
比如說window.open(),如果你單獨掉用open()方法而前面沒有加上window,那麼就可以理解成靜態範圍並非靜態,也就是說你沒有加上是哪個對象的引用,比如說數組,我們每定一個數組,如果要訪問它的數組的某個元素,就得加上數組的下標才能訪問得到。
你上面的程式我來幫你更改一下,或許你就會明白其中的道理了

function sayHi()
{
alert("hi");

var alternate=alternte
//如果alternte加上()那麼就等於這個局部變數接受下面這個函數所返回的值。
//如果alternte沒有加上(),那麼就等於這個局量用來執行下面所定義的函數。
function alternate()
{
return alert("hola");
//alert("hola");
};

}

上面這個代碼,相當於我把某個功能封裝起來了,如果你要調用,那就得建立對象。
var sa=new sayHi();
這時就可以使用sa就是個對象,你就可以使用sa這引用變數來調用你裡所定義的一些屬性和方法。如下所示:
sa.alternate

通過這個sa的引用調用alternate的屬性,就可以調用alternate()
你也可以使用sa對象來直接調用alternate()
如:sa.alternate()

說完了,也說得亂七八糟,不知能否讓你理解。
 
JavaScript 裡 靜態方法 可以用 對象方法() ?

該方法是 Date 對象的靜態方法。一般採用 Date.parse() 的形式來調用,而不是通過 dateobject.parse() 調用該方法。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.