JavaScript物件導向程式設計(3): 對象

來源:互聯網
上載者:User
1. 對象 對象是物件導向程式設計的基礎概念之一,只需看看這個名字就已經知道了。在我們熟悉的物件導向語言中,比如Java或者C++,都有著類似的對象定義方法。比如,我們想定義一個類,名字叫Person,有兩個屬性:name和age,另外有一個方法,將顯示出這個Person對象的名字和年齡,那麼我們可以用下面的代碼實現: Java: public class Person {    
        private String name;    
        private int age;    

        public String getName() {    
                return name;    
        }    

        public void setName(String name) {    
                this.name = name;    
        }    

        public int getAge() {    
                return age;    
        }    

        public void setAge(int age) {    
                this.age = age;    
        }    

        public void introduction() {    
                System.out.println("My name is " + this.name + ", my age is " + this.age);    
        }

        public static void main(String[] args) {
                Person p = new Person();
                p.setName("Tom");
                p.setAge(20);
                p.introduction();
        }
} C++的實現也是類似的,這裡不再贅述。 我們先來看一下這個類的定義:首先聲明屬性,然後定義屬性的getter和setter方法,用來外界訪問私人變數,最後定義了它自己的方法。這是一個比較常見的定義方式,以至於以後的很多語言,比如C#,都採用這種定義。 那麼,什麼是對象呢?對象不過是具有特定屬性和方法的集合。雖然這並不是一個嚴格的定義,但是將屬性和它的名字(不妨我們把它的方法也看作是它的屬性,這並沒有什麼不同)放在一起,形成一個集合,這就是對象。也就是說,簡單來看,對象就是這種具有“鍵-值”對的形式。 2. JavaScript的對象 “鍵-值”對的形式……這個樣子看上去是不是有些面熟?Bingo!對了!這不就是數組的形式嗎?嗯,恭喜你想到這一點!的確,在JavaScript中,對象的定義就是像數組的定義。下面,我們在JavaScript中對這個Person進行一下定義: var Person = {    
        "name": "Tom",    
        "age": 20,    
        "introduction": function() {    
                alert("My name is " + this.name + ", my age is " + this.age);    
        }    
};    
Person.introduction(); 來看一下這段代碼。看上去很像數組的定義,只不過數組一般使用數字類型作為下標,而這裡我們使用的是字串。回想一下,其實在JavaScript中,字串也是可以作為數組下標的,不是嗎?好了,這裡我們聲明了一個對象Person,它有一個name,還有一個age,而且還有一個方法顯示出這兩個屬性。 在JavaScript中,對象就是“鍵-值”對的形式,具體來說是"string-as-key": object-as-value的形式。也就是說,這個鍵必須是string類型的,而值可以是任何類型的。那麼,方法呢?其實,JavaScript中的function也是一個類型,這個在後面會有描述的,這裡僅僅Crowdsourced Security Testing道就可以了。這種數學上成為二元組的樣式很常見,數組就是這樣的,只不過數組的鍵必須是int。同樣,JavaScript的對象也是一個特殊的二元組,只不過鍵是string類型的。這是不是就像是一種散列?或者說是雜湊表?就是這個樣子! 如果說你覺得每個屬性名稱都要加一個引號覺得很彆扭,那麼你大可不加!像下面的語句,JavaScript完全認為你的正確的: var Person = {
        name: "Tom",
        age: 20,
        introduction: function() {
                alert("My name is " + this.name + ", my age is " + this.age);
        }
}
Person.introduction(); 我比較習慣於這種寫法,看上去和Java等語言差不多。 3. 屬性的使用 JavaScript中屬性的使用或許比較特別。看下面試圖使用Person的name屬性的四個語句,看上去都差不多,實際上也確實如此: alert(Person.name);
// alert(Person."name");
alert(Person["name"]);
alert(Person[name]); 除去注釋掉的一句,其他的三個語句都能夠通過解釋(由於JavaScript是解釋型語言,不是編譯型的,因此這裡不說是編譯),但是只有1、3句能夠取出name屬性!第一句和Java沒有什麼區別,後面的兩個顯得比較特別,第三句看上去像什嗎?對了!數組元素的訪問!這進一步驗證了JavaScript中的數組和對象“本是同根生”。那麼,第四句呢?當然是返回undefined!因為數組下標必須是數字或者字串嘛! 熟悉Java的話或許會對introduction函數有些疑問。Java程式員不會時時刻刻把this加上,除非哪天心血來潮,才會加上這個this。但是,如果你想在JavaScript中偷懶,去掉this,結果只會是報錯。這是怎麼回事呢?簡單來說,在這裡的this關鍵字是必不可少的!這是JavaScript與其他語言的不同。具體為什麼,會在以後的文章中說明,現在只是知道就好了——不要在這裡偷懶哦~~ 4. 更多屬性的操作 現在對JavaScript對象屬性的認識應該在這樣一點上:JavaScript的對象就是一個二元組,或者說就是一個散列或雜湊表。如果能明白這一點,就不會對下面的操作有所奇怪了: var Person = {}; // 建立一個Null 物件
Person.name = "Tom"; // 添加一個屬性name,並賦值為Tom
Person["age"] = 20; // 用另外的辦法新增屬性
Person.introduction = function () {
        alert("My name is " + this.name + ", my age is " + this.age);
};
Person.introduction();
for(var field in Person) { // 使用foreach迴圈列出對象中所有屬性
        alert("field name: " + field + "; value: " + Person[field]);
}
delete Person.name; // 刪除name屬性
Person.introduction();
alert(name in Person); // 使用in操作符判斷屬性是否存在 5. 對象的constructor屬性 在JavaScript中,每個對象都有一個constructor屬性。這個constructor屬性用來記錄對象初始化時的建構函式名字。例如: var date = new Date();
alert(date.constructor);
alert(date.constructor == "Date"); // false
alert(date.constructor == Date); // true 嗯,這個Date是JavaScript的內建對象。這裡的代碼看上去很平常。不過,如果你要使用自己寫的對象,比如前面的Person,就會發現它的constructor對象怎麼是Object?這裡有兩個問題:第一,我們並沒有給Person constructor屬性,它怎麼會有的?第二,這個constructor屬性怎麼是object,而不是我們的Person呢? 對於第一個問題,很明顯,是JavaScript給我們加上的。事實上,每個JavaScript對象都會有這樣一個屬性。那麼,它的值又怎麼是Object呢?這個問題,在我們說道new這個運算子的時候會給大家說明的。這裡請大家注意,本文中的對象其實是指的單獨的使用new之後得到的對象。也就是說,那個constructor屬性是在new運算子的時候獲得的。這就涉及到建構函式了——不過這不是本文的重點,以後再說吧~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.