五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > [翻譯文章]javascript的對象(how javascript objects works?)

[翻譯文章]javascript的對象(how javascript objects works?)

文章來源:365jz.com     點擊數(shù):266    更新時間:2009-09-16 11:39   參與評論

英文原文

本文主要講以下三點:
  • javascript對象就是哈希表,用.訪問屬性和用下標訪問是一樣的。
  • function只是特別的對象而已。
  • 用JSON創(chuàng)建對象。

構建簡單的對象

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屬性之前我們不用去聲明它,同時,這個方法是沒有名字的。

.語法 vs. 下標語法 (Dot syntax vs subscript syntax)

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 literal syntax)

在例一中我們通過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"); }
};

什么時候有用?(when is this useful?)

一般情況下,當你想要在腳本中傳遞一組相關的變量時,創(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)友會為你解答??! 點擊進入論壇

發(fā)表評論 (266人查看0條評論)
請自覺遵守互聯(lián)網(wǎng)相關的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術支持
· 服務時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權所有 鄂ICP備17013400號