多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > jscript > 面向對象的編程思想在javascript中的運用(上)

面向對象的編程思想在javascript中的運用(上)

來源:程序員人生   發布時間:2013-10-06 10:16:20 閱讀次數:2662次

對于正在從事或者打算從事編程的人來說,面向對象是一個耳熟能詳的詞,幾乎每一個人都能列舉出一些面向對象的編程語言,例如C++,JAVA,C#等等。其實,面向對象的思想是獨立于編程語言的,例如在C#中,在一個靜態類的靜態方法中,按照過程式開發調用一系列靜態函數,我們很難說這是面向對象的編程,相反,象jquery和extjs這樣優秀的javascript庫,卻處處體現著面向對象的設計思想。本文不打算探討javascript是否能夠算做面向對象的編程語言,這個問題是重視中國式考試的人應該關注的,我這里只是簡單的說明如何在javascript中使用面向對象的編程思想。

面向對象首先要有對象。在javascript中創建一個對象非常簡單:

var o={};
<!--[endif]-->

這樣就產生了一個對象,我們可以很方便的給這個對象添加屬性和方法:

o.name="object name";
o.showName=function(){
alert(o.name);
} <!--[endif]-->
不過大多數人還是習慣把對象的屬性和方法放在定義對象的一對{}里邊:

var o = {
name: "object name",
showName: function() {
alert(o.name);
}
}

訪問屬性和方法有兩種方式,第一種:

alert(o.name);
o.showName();

這種寫法很常見,C#中調用對象的屬性和方法也是這種方式。還有一種是javascript中比較特別的,使用屬性或者方法的名字作為索引來進行訪問:

alert(o["name"]);
o["showName"]();

這好像有點和孔乙己“茴香的茴字有幾種寫法”差不多了,事實上,很少有人使用索引來調用對象的屬性或者方法。
除了我們自定義的屬性和方法,我們的對象還有一個constructor屬性以及toString()等方法。這些屬性和方法是從Object內置對象來的,所有的對象都會有這些屬性和方法。其中constructor屬性指向構造出該對象的構造函數。我們沒有使用構造函數來創建對象,事實上,js的解釋器會使用Object構造函數。如果我們自己定義了構造函數,那么便可以通過該構造函數來創建對象,這樣可以使得創建的對象具有相同的屬性和方法,這便開始有點面向對象的味道了。好,我們從一個簡單的例子開始看看如何創建一個構造函數吧:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
this.showInfo = function() {
alert("姓名:" + this.name + " 性別:" + this.sex + " 年齡:" + this.age);
}
}

我們定義了一個名字叫Person的構造函數,該構造函數有三個屬性和一個方法,通過構造函數來產生一個對象并調用方法也非常簡單:

var zhangsan = new Person("張三", "男", 18);
zhangsan.showInfo();

運行后我們可以看到彈出一個對話框,顯示出這個叫張三的人的信息:

我們還可以看看對象的constructor屬性來看看zhangsan的構造函數是不是我們定義好的Person:

alert(zhangsan.constructor);
結果如圖:

可以看到,正是我們的Person構造函數。

不過,這里還是有點問題,每一次我們構造一個對象,都會在內存中為屬性和方法分配內存空間,而事實上,所有的對象完全可以用同一個方法,并不需要有多個方法的副本,這樣有些浪費內存空間。既然意識到了這個問題,讓我們來想想如何解決吧。一個很自然的想法是,既然我們只想為方法分配一次內存空間,那么我們可以設置一個值用來標識方法的內存空間是否已經分配,按照這個思路,我們將構造函數做如下修改:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
if (typeof Person._initialized == "undefined") {
this.showInfo = function() {
alert("姓名:" + this.name + " 性別:" + this.sex + " 年齡:" + this.age);
}
Person._initialized = true;
}
}

這里,我們用一個成員_initialized來指示是否已經對方法進行了內存空間的分配。當第一個對象構造的時候_initialized未被定義,所以我們的判斷語句為真,這時會對方法進行了定義并分配內存空間,然后把_initialized的值設置為true,用以表明方法的內存空間已經分配了。第二個對象構造的時候則不會再進入判斷,因而也不會再一次分配內存空間。似乎沒什么問題,運行一下看看,張三的信息依然正常顯示。雖然不辛苦,不過解決了一個小問題,還是慶祝下吧,來盤回鍋肉,我要大快朵頤。還沒開吃,一個叫李四的MM也想讓電腦彈出她的個人信息。OK,很簡單,再構造一個對象,然后調用showInfo方法就可以了:

var lisi = new Person("李四", "女", 28);
lisi.showInfo();

為了照顧MM,還把這段放在了張三的前邊。MM的信息正確顯示出來了,可是張三的資料不見了。這下張三不樂意了,排名放在MM后邊也罷了,但好歹得有名字啊。這可苦了我這編程人員,回鍋肉看來沒辦法吃了,先改bug吧。打開firebug,看到MM的信息顯示之后出現錯誤,提示為:zhangsan.showInfo is not a function。設置斷點看看,構造zhangsi對象以后發現并沒有showInfo這個方法。原來showInfo方法雖然只有一個,但是存在于第一個對象之中,第二個對象并不能訪問。那么,究竟如何才能讓同一個構造函數產生的對象共用同一個函數呢?javascript中的prototype給我們提供了這個功能。根據javascript的規范中描述,每一個構造函數都有一個prototype屬性用于實現繼承和屬性的共享。我們的showInfo方法也可以看作是一個屬性,該屬性指向一個函數的引用?,F在我們使用prototype來使得我們的方法可以共享,代碼的改動很簡單,把this.showInfo改成Person.prototype.showInfo就可以了,改動之后的代碼如下:

function Person(name, sex, age) {
this.name = name;
this.sex = sex;
this.age = age;
if (typeof Person._initialized == "undefined") {
Person.prototype.showInfo = function() {
alert("姓名:" + this.name + " 性別:" + this.sex + " 年齡:" + this.age);
}
Person._initialized = true;
}
}

使用該構造函數生成兩個對象:

var lisi = new Person("李四", "女", 28);
lisi.showInfo();
var zhangsan = new Person("張三", "男", 18);
zhangsan.showInfo();

運行之后先顯示李四的信息,然后是張三的信息。

轉自:http://www.cnblogs.com/yage/

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 一区二区三区观看 | 亚洲天堂一区二区 | 国产精品秋霞午夜 | 免费jizz在在线播放国产 | 乌克兰鲜嫩xxxx| 欧美日韩视频 | 中国国产一国产一级毛片视频 | 亚欧美综合 | 日本大片免费一级 | 女人洗澡一级特黄毛片 | 国产精品嫩草影院在线看 | 亚洲国产精品ⅴa在线观看 亚洲国产精品aaa一区 | 成人精品视频在线观看播放 | 午夜dj影院在线观看免费视频中文 | 国内自拍在线视频高清 | 亚洲一区二区三区四区视频 | 久久爱老牛影视一区二区 | 亚洲精品久久久久久久网站 | 欧美 日本 亚洲 | 最近最新中文字幕在线手机版 | 日本a级毛片免费视频播放 日本a毛片 | 日韩一区二区三区四区不卡 | 亚洲欧美自拍另类图片色 | 2020久久国产最新免费观看 | 亚洲精品在线播放视频 | 久久网伊人 | 亚洲欧美在线观看首页 | 久久亚洲精品一区成人 | yy一级毛片免费视频 | haose16在线永久免费 | 欧美日韩一本二本 | 国产精欧美一区二区三区 | 91精品一区二区三区在线观看 | 婷婷在线视频国产综合 | 宅男午夜在线 | 美国一级毛片片aa免 | 日本亚洲网站 | h免费网站| 国产操女 | 亚洲图片小说区 | 日本最新在线 |