|
你可能對(duì)于一些其它的編程語(yǔ)言很熟悉,比如C++或者Java等等,它們也是可以創(chuàng)建對(duì)象的,現(xiàn)在最新的VB版本VB.NET也具有了更好的面向?qū)ο蠊δ?----創(chuàng)建對(duì)象。從本質(zhì)上講,創(chuàng)建對(duì)象的想法只是為了創(chuàng)建一個(gè)簡(jiǎn)單的實(shí)體,這個(gè)實(shí)體包含了許多屬性和方法。以下是一個(gè)對(duì)象構(gòu)造器的例子:
因?yàn)槲覀兝胣ame增加了Person的屬性,所以它們必須通過(guò)name來(lái)被引用,這點(diǎn)在后面的代碼中可以看到。如果我們使用數(shù)字,那么我們就必須使用數(shù)字來(lái)引用,比如要用somebody[0],而不用somebody.name。Javascript的數(shù)組和對(duì)象(比如 forms,images,frames,…)都允許這兩種方法。 另外地,數(shù)組和對(duì)象都有一個(gè)本質(zhì)的屬性,即length(長(zhǎng)度)。我們?cè)诰幹瞥绦虻臅r(shí)候,可以這樣來(lái)使用它:objectName.length,它返回對(duì)象包含的元素或者屬性的個(gè)數(shù)。 屬性同樣也可以從函數(shù)中來(lái)創(chuàng)建,這樣,你只需要增加一行到Person函數(shù)中就可以創(chuàng)建屬性了: function Person(name, age, colour) { this.name = name; this.age = age; this.colour = colour; this.birthYear = (new Date()).getYear() - this.age; } 以上的Person函數(shù)定義了第四個(gè)屬性:birthYear,它代表每一個(gè)Person的出生年份。這里要注意,這一增加的行是調(diào)用一個(gè)內(nèi)置的Date構(gòu)造器,它返回一個(gè)包含了當(dāng)前日期和時(shí)間的Date對(duì)象。 這是一個(gè)非常懶惰的方法來(lái)訪問(wèn)一個(gè)Date變量。所以使用下面的代碼會(huì)顯得更準(zhǔn)確些,更有可讀性: var today = new Date(); this.birthYear = today.getYear() - this.age; 當(dāng)然,有許多方法來(lái)對(duì)JavaScript程序進(jìn)行“壓縮”。通過(guò)插入對(duì)象到代碼中,你就可以處理絕大多數(shù)的變量。 這個(gè)Date對(duì)象比起我們上面定義的Person對(duì)象來(lái)說(shuō)更復(fù)雜,因?yàn)樗嗽L問(wèn)方法(accessor/get)以及操作方法(manipulator/set)。同時(shí),增加簡(jiǎn)單的對(duì)象方法到JavaScript中是可能,下面是詳細(xì)的例子代碼: <SCRIPT language="JavaScript"> <!-- Hide from older browsers function Person(name, age, colour) { this.name = name; this.age = age; this.colour = colour; this.birthYear = (new Date()).getYear() - this.age; this.toString = printPerson; // 這里定義the Person.toString() 方法 this.isOlder = isOlder; // 這里定義Person.isOlder(Person) 方法 } function printPerson() { var text = this.name + " was born in " + this.birthYear +"<br>"; text += "and is " + this.age + " years old.<p>"; return text; } function isOlder(otherPerson) { // 這里定義是否第一個(gè)人是更老的 return (this.age > otherPerson.age); // 返回布爾型數(shù)值 } //下面的代碼用于測(cè)試我們的函數(shù) var body1 = new Person("Patrick", 22, "red"); var body2 = new Person("Betty", 21, "green"); document.write(body1); //這里為Person.toString()創(chuàng)建一個(gè)調(diào)用 document.write(body2); document.write(body1.name); document.write((body1.isOlder(body2)) ? " is " : " is not "); // 是否更老? document.write("older than " + body2.name); // Stop hiding --> </SCRIPT> 通過(guò)為Person對(duì)象重載Person.toString()方法,我們可以將Person對(duì)象作為字符串顯示出來(lái)。每當(dāng)Person對(duì)象被作為字符串引用的時(shí)候,pringPerson返回的數(shù)值就決定了該顯示什么了。 上面腳本的輸出如下所示: Patrick was born in 76 and is 22 years old. Betty was born in 77 and is 21 years old. Patrick is older than Betty 從輸出的結(jié)果我們可以看到年份是以兩位數(shù)字表示的,如1976年只用76來(lái)表示。所以你可能想增加“19”到這兩位數(shù)字的前面。不幸的是,“千年蟲(chóng)”的問(wèn)題使得你處理起來(lái)有點(diǎn)棘手。而不同的瀏覽器處理Date對(duì)象的getYear()方法是不同的。
你可以從上面表格中發(fā)現(xiàn)最新的瀏覽器支持1999年之后四位的年份格式(如2000、2001)。不幸的是,老的瀏覽器處理年份的格式的時(shí)候給程序設(shè)計(jì)人員無(wú)盡的困惑。我經(jīng)常使用的具體解決方法如下所示,與大家共享: var thisYear = (new Date()).getYear(); thisYear = 1900 + (thisYear % 1900); 這里(thisYear % 1900)作用是將年份轉(zhuǎn)換位IE 3.x格式并且增加1900以得到真實(shí)的年份(比如,2002年經(jīng)過(guò)this Year%1900轉(zhuǎn)換位IE 3.x格式位102,然后102再加上1900得到2002)。上面這兩條語(yǔ)句可以適用于從1900年到3799年的處理,現(xiàn)在看起來(lái)這么長(zhǎng)的時(shí)間是足夠使用了。但是,為了避免類似于“千年蟲(chóng)”問(wèn)題,我們應(yīng)該再找出更好的解決方案,在本教程中就不給出了。另外,新的ECMA標(biāo)準(zhǔn)包括了一個(gè)名為getFullYear()的函數(shù),它是返回完整的年份格式,但是這個(gè)函數(shù)只能被Navigator 4支持,在IE中是不能使用的。 最后對(duì)程序再做一點(diǎn)改進(jìn),我們可以修改People構(gòu)造器以轉(zhuǎn)換年份為YYYY格式,具體代碼如下: this.birthYear = 1900 + (((new Date()).getYear() - this.age) % 1900); 在JavaScript中使用對(duì)象的能力通常被許多程序設(shè)計(jì)人員所忽視。但是從本教程中,你應(yīng)該可以看到使用對(duì)象可以使程序員設(shè)計(jì)出功能更強(qiáng)大的應(yīng)用程序來(lái)的。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!