如何學好JavaScript(五) —— 類和對象
來源:易賢網 閱讀:693 次 日期:2015-04-22 11:36:59
溫馨提示:易賢網小編為您整理了“如何學好JavaScript(五) —— 類和對象”,方便廣大網友查閱!

首先,不得不說,我無法達到拋開類和對象的概念來看Javascript的境界,對于Javascript是否是面向對象的說法有很多,不過我最認同的還是Javascript是一種“基于prototype的面向對象語言”。

面向對象語言三大特點:繼承,多態(tài),封裝,這三點雖然Javascript沒有提供天然的語法實現(xiàn),但是我們都可以通過prototype等技巧來實現(xiàn),因此這種說法似乎不過分。

在Javascript中,構造對象有三種方式:

1. 首先,我們要明確一個概念,Javascript是一種弱類型的語言,一方面體現(xiàn)在Javascript的變量,返回類型都是沒有強類型約束的,另一方面,Javascript可以為對象任意添加屬性和方法。根據(jù)這個,我們可以寫出這樣的代碼:

<script type="text/javascript">

var person = {};

person.name = "飛林沙";

person.age = 21;

person.Introduce = function () {

alert("My name is " + this.name + ".I'm " + this.age);

};

person.Introduce();

script>

這里的person就是我們構造出的一個對象。

2. 我們也可以利用JSON的形式來構造一個對象。

<script type="text/javascript">

var person = {

name: "飛林沙",

age: 21,

Introduce: function () { alert("My name is " + this.name + ".I'm " + this.age); }

};

person.Introduce();

script>

這個是不是很像我們在C#3.0里提出的匿名對象呢?

protected void Page_Load(object sender, EventArgs e)

{

var person = new

{

name = "飛林沙",

age = 21

};

Response.Write("My name is " + person.name + ".I'm " + person.age);

}

不同的是在Javascript中,函數(shù)是一種類型,所以可以賦給某個變量,但是C#不可以。

但是上面兩種方法我們看到,我們都是單獨定義了一個對象。接下來讓我們把他們抽象出來成為一個類。

<script type="text/javascript">

var Person = function () {

this.name = "飛林沙";

this.age = 21;

this.Introduce = function () {

alert("My name is " + this.name + ".I'm " + this.age);

};

};

var person = new Person();

person.Introduce();

script>

可是在這里,我們看到,屬性都已經被寫死了,我們根本沒辦法為每個對象單獨訂制,解決辦法很簡單:

<script type="text/javascript">

var Person = function (name, age) {

this.name = name;

this.age = age;

this.Introduce = function () {

alert("My name is " + this.name + ".I'm " + this.age);

};

};

var person = new Person("飛林沙", 21);

person.Introduce();

script>

好,我們來對比一下第二種和第三種寫法,兩者是等效的。在第二種寫法中,實際上是構建了一個JSON對象,而我們又知道JSON本質上其實就是一個鍵值對,那么我們是否也可以用同樣的方式來理解一個對象呢?

我們來寫出這樣的測試代碼試試:

<script type="text/javascript">

var Person = function (name, age) {

this.name = name;

this.age = age;

this.Introduce = function () {

alert("My name is " + name + ".I'm " + age);

};

};

var person = new Person("飛林沙", 21);

for (var p in person) {

alert(p);

}

alert(person["name"]);

script>

這樣的代碼沒偶任何問題,首先用遍歷的方式來找到person所有的key(屬性和方法名)。然后我們用索引的方式來訪問person對象的name屬性。

這些都沒有問題,可是我們是不是看到了一個引申的問題,從傳統(tǒng)面向對象的語言來看,name和age應該屬于私有變量,那么這樣用person簡簡單單的訪問,是不是破壞了封裝性呢?

還記得我們在前文中說過的么?var的叫變量,沒有var的叫屬性。那么我們如果講代碼改成這個樣子。

<script type="text/javascript">

var Person = function (name, age) {

var name = name;

var age = age;

this.GetName = function () {

return name;

}

this.GetAge = function () {

return age;

}

this.Introduce = function () {

alert("My name is " + name + ".I'm " + age);

};

};

var person = new Person("飛é林?沙3", 21);

alert(person["name"]);

alert(person.GetName());

script>

這樣就可以封裝得很好了,這也是在Javascript中的封裝方式。

好,關于Javascript的類和對象就說到這,但是這里面仍然有一些問題。我們會在下文中提及。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網