英文原文
本文主要講以下三點:javascript的對象可以完全看做是哈希表。屬性和方法是哈希表的表項,其中屬性名和方法名是哈希表的鍵值。javascript對象的方法也是屬性,只不過這個屬性的值恰好是函數(shù)類型而已。(A javascript object’s methods are just a property that happen to be a function.)
請看下面的代碼:
var rufus = new Object(); rufus.name = "rufus"; rufus.species = "cat"; rufus.hello = function() { alert("miaow"); }
javascript 的對象是動態(tài)的,在使用屬性之前不必去先聲明。在運行時你可以隨意的去給以個對象新增屬性,你所要做的就是直接為新屬性賦值就可以了。同時,所有相同類型的對象可以共享對象的實現(xiàn)方法而不必像C#或java那樣顯式的聲明對象的數(shù)據(jù)類型,javascript是通過構造函數(shù)(constructor function)和對象原型(object prototypes)來實現(xiàn)的。
請注意在上面的代碼中我們賦給rufus對象的hello屬性是一個函數(shù),而不是像字符串或者數(shù)字那樣的基本數(shù)據(jù)類型。這之所以成為可能是因為在javascript中,函數(shù)只不過是一類特殊的對象而已。本質(zhì)上和字符串,數(shù)字等基本數(shù)據(jù)類型是一樣的。還是那句話,javascript對象的方法也是屬性,只不過這個屬性的值恰好是函數(shù)類型而已。(A javascript object’s methods are just a property that happen to be a function.)
rufus的hello屬性石一個匿名方法(anonymous functions),在我們把它賦給rufus的hello屬性之前我們不用去聲明它,同時,這個方法是沒有名字的。
javascript中的對象就是哈希表,就是 鍵/值 對而已,沒有什么特別的。一個有力的證明就是你既可以像傳統(tǒng)的訪問對象屬性那樣使用 對象名.屬性名 的做法,也可以像訪問哈希表那樣直接用 對象名.下標 的做法。
因此上面的代碼也可以這樣寫:
var casper = new Object(); casper["name"] = "casper"; casper["species"] = "bird"; casper["hello"] = function() { alert("squark! squark!"); }
兩種語法是對同一件事的不同描述而已,其本質(zhì)是一樣的,甚至你可以兩種方法混用。不過推薦使用 點語法 ,因為這樣訪問對象的屬性對于c#和java等語言的程序員來說看起來更自然一些。
有些情況使用下標這種語法更有優(yōu)勢,因為使用下標訪問屬性時,使用字符串來檢索屬性名的。這樣我們可以再運行時動態(tài)構建這樣的字符串來訪問對象的屬性和方法。
以下代碼演示了使用foreach循環(huán)來遍歷rufus對象的屬性,和for循環(huán)動態(tài)訪問myObject的三個屬性。
for(var property in rufus) alert(rufus[property].toString()); var myObject = { property1: "chocolate", property2: "cake", property3: "brownies" } for(var x=1; x<4; x++) alert(myObject["property" + x]);
在例一中我們通過Object的構造函數(shù)生成了一個對象。有一種更快的方法(打更少的字)來建立一個對象,那就是通過對象的字段值 。
一種簡單的方法是直接將一對大括號賦值給一個變量就可以了,這等同于調(diào)用了Object的構造函數(shù)。代碼如下:
var empty1 = {}; // 和下一行等效,但是錄入時更快。 var empty2 = new Object();
字面值還可以用來設置對象的屬性,要設置的屬性以 鍵/值 對的形式建立(就是JSON)。如果你在創(chuàng)建對象時有一大堆屬性要創(chuàng)建,那么這個特性是很有用的,請看下例:
這個例子和例一的效果是一樣的。
var sabby = { name : "Sabby", species: "cat", hello : function() { alert("hissss"); } };
一般情況下,當你想要在腳本中傳遞一組相關的變量時,創(chuàng)建這樣的小對象很有用。
假設這樣一種情形,你正在使用一個類庫,這個類庫支持自定義事件,你想要傳遞事件相關的一些信息給事件處理程序,你應該怎么去做呢?這時你可以寫很多行代碼,來創(chuàng)建對象,并且為對象的屬性賦值,當然,你也可以通過使用對象的字段量(JSON),通過一行代碼來搞定。通常情況下,這對于事件處理程序來說是沒有區(qū)別的。如下:
this.fireEvent({element: navigationElement, state : "active" }); …? function onNavigationStateChange(e){ // do something here alert(e.element.id + " is " + e.state); }
另外,當你要創(chuàng)建一系列相關的庫函數(shù)時(和在C#中創(chuàng)建一個僅包含靜態(tài)方法的類很類似),簡單對象(特別是通過JSON來創(chuàng)建對象)是很有用的。
以下是一個簡單的ArrayHelper類:
var ArrayUtil = { contains : function(array, element) { for(var x=0; x<array .length; x++) { if(array[x] == element) return true; } return false; }, exclude : function(list, items) { …? }, makeList : function(list) { …? } } var list = ["A", "B", "C"]; alert("Has A? " + ArrayUtil.contains(list, "A"));
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇