javascript面向?qū)ο缶幊蹋ㄒ唬悍庋b

對(duì)象:javascript中的對(duì)象就是屬性和方法的集合刃泡。

一虑省、生成實(shí)例對(duì)象的原始模式
假定我們把貓看成一個(gè)對(duì)象忧饭,它有"名字"和"顏色"兩個(gè)屬性曼玩。
<pre>
var Cat = {
name: '',
color: ''
}
</pre>
現(xiàn)在鳞骤,我們需要根據(jù)這個(gè)原型對(duì)象的規(guī)格(schema),生成兩個(gè)實(shí)例對(duì)象黍判。
<pre>
  var cat1 = {}; // 創(chuàng)建一個(gè)空對(duì)象
    cat1.name = "大毛"; // 按照原型對(duì)象的屬性賦值
    cat1.color = "黃色";
  var cat2 = {};
    cat2.name = "二毛";
    cat2.color = "黑色";
</pre>
好了豫尽,這就是最簡(jiǎn)單的封裝了,把兩個(gè)屬性封裝在一個(gè)對(duì)象里面顷帖。但是美旧,這樣的寫法有兩個(gè)缺點(diǎn),一是如果多生成幾個(gè)實(shí)例贬墩,寫起來(lái)就非常麻煩榴嗅;二是實(shí)例與原型之間,沒(méi)有任何辦法震糖,可以看出有什么聯(lián)系。
二趴腋、原始模式的改進(jìn)
我們可以寫一個(gè)函數(shù)吊说,解決代碼重復(fù)的問(wèn)題。
<pre>
  function Cat(name,color) {
    return {
      name:name,
      color:color
    }
  }
</pre>
然后生成實(shí)例對(duì)象优炬,就等于是在調(diào)用函數(shù):
<pre>
  var cat1 = Cat("大毛","黃色");
  var cat2 = Cat("二毛","黑色");
</pre>
這種方法的問(wèn)題依然是颁井,<code>cat1</code>和<code>cat2</code>之間沒(méi)有內(nèi)在的聯(lián)系,不能反映出它們是同一個(gè)原型對(duì)象的實(shí)例蠢护。
三雅宾、構(gòu)造函數(shù)模式
為了解決從原型對(duì)象生成實(shí)例的問(wèn)題,Javascript提供了一個(gè)構(gòu)造函數(shù)(Constructor)模式葵硕。
所謂"構(gòu)造函數(shù)"眉抬,其實(shí)就是一個(gè)普通函數(shù)贯吓,但是內(nèi)部使用了<code>this</code>。對(duì)構(gòu)造函數(shù)使用<code>new</code>運(yùn)算符蜀变,就能生成實(shí)例悄谐,并且<code>this</code>變量會(huì)綁定在實(shí)例對(duì)象上。
比如库北,貓的原型對(duì)象現(xiàn)在可以這樣寫爬舰,
<pre>
  function Cat(name,color){
    this.name=name;
    this.color=color;
  }
</pre>

我們現(xiàn)在就可以生成實(shí)例對(duì)象了。
<pre>
  var cat1 = new Cat("大毛","黃色");
  var cat2 = new Cat("二毛","黑色");
  alert(cat1.name); // 大毛
  alert(cat1.color); // 黃色
</pre>
這時(shí)<code>cat1</code>和<code>cat2</code>會(huì)自動(dòng)含有一個(gè)<code>constructor</code>屬性寒瓦,指向它們的構(gòu)造函數(shù)情屹。
<pre>
  alert(cat1.constructor == Cat); //true
  alert(cat2.constructor == Cat); //true
</pre>
四、構(gòu)造函數(shù)模式的問(wèn)題
構(gòu)造函數(shù)方法很好用杂腰,但是存在一個(gè)浪費(fèi)內(nèi)存的問(wèn)題垃你。
請(qǐng)看,我們現(xiàn)在為<code>Cat</code>對(duì)象添加一個(gè)不變的屬性<code>type</code>(種類)颈墅,再添加一個(gè)方法<code>eat</code>(吃)蜡镶。那么,原型對(duì)象<code>Cat</code>就變成了下面這樣:
<pre>
  function Cat(name,color){
    this.name = name;
    this.color = color;
    this.type = "貓科動(dòng)物";
    this.eat = function(){alert("吃老鼠");};
  } 
</pre>
還是采用同樣的方法恤筛,生成實(shí)例:
<pre>
  var cat1 = new Cat("大毛","黃色");
  var cat2 = new Cat ("二毛","黑色");
  alert(cat1.type); // 貓科動(dòng)物
  cat1.eat(); // 吃老鼠
</pre>
表面上好像沒(méi)什么問(wèn)題官还,但是實(shí)際上這樣做,有一個(gè)很大的弊端毒坛。那就是對(duì)于每一個(gè)實(shí)例對(duì)象望伦,<code>type</code>屬性和<code>eat()</code>方法都是一模一樣的內(nèi)容,每一次生成一個(gè)實(shí)例煎殷,都必須為重復(fù)的內(nèi)容屯伞,多占用一些內(nèi)存。這樣既不環(huán)保豪直,也缺乏效率劣摇。
<pre>
  alert(cat1.eat == cat2.eat); //false
</pre>
五、<b>preototype</b>模式

Javascript規(guī)定弓乙,每一個(gè)構(gòu)造函數(shù)都有一個(gè)<code>prototype</code>屬性末融,指向另一個(gè)對(duì)象。這個(gè)對(duì)象的所有屬性和方法暇韧,都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承勾习。
原型鏈:假設(shè)要查詢對(duì)象o的x屬性,如果o自身沒(méi)有x屬性懈玻,那么將會(huì)繼續(xù)在o的原型對(duì)象中查詢屬性x巧婶。如果o的原型對(duì)象中也沒(méi)有x屬性,那該原型對(duì)象也有原型,那繼續(xù)在原型對(duì)象的原型上執(zhí)行查詢艺栈,直到找到x或者查找到一個(gè)原型為null的對(duì)象為止英岭。
這意味著,我們可以把那些不變的屬性和方法眼滤,直接定義在<code>prototype</code>對(duì)象上巴席。
<pre>
  function Cat(name,color){
    this.name = name;
    this.color = color;
  }
  Cat.prototype.type = "貓科動(dòng)物";
  Cat.prototype.eat = function(){alert("吃老鼠")};
</pre>
然后生成實(shí)例。
<pre>
  var cat1 = new Cat("大毛","黃色");
  var cat2 = new Cat("二毛","黑色");
  alert(cat1.type); // 貓科動(dòng)物
  cat1.eat(); // 吃老鼠
</pre>
這時(shí)所有實(shí)例的<code>type</code>屬性和<code>eat()</code>方法诅需,其實(shí)都是同一個(gè)內(nèi)存地址漾唉,指向<code>prototype</code>對(duì)象,因此就提高了運(yùn)行效率堰塌。
六赵刑、<b>Prototype</b>模式的驗(yàn)證方法
為了配合<code>prototype</code>屬性,<code>Javascript</code>定義了一些輔助方法场刑,幫助我們使用它般此。
6.1 isPrototypeOf()
這個(gè)方法用來(lái)判斷,某個(gè)<code>proptotype</code>對(duì)象和某個(gè)實(shí)例之間的關(guān)系牵现。
<pre>
  alert(Cat.prototype.isPrototypeOf(cat1)); //true
  alert(Cat.prototype.isPrototypeOf(cat2)); //true
</pre>
6.2 hasOwnProperty()
每個(gè)實(shí)例對(duì)象都有一個(gè)<code>hasOwnProperty()</code>方法铐懊,用來(lái)判斷某一個(gè)屬性到底是本地屬性,還是繼承自<code>prototype</code>對(duì)象的屬性瞎疼。
<pre>
  alert(cat1.hasOwnProperty("name")); // true
  alert(cat1.hasOwnProperty("type")); // false
</pre>
6.3 in運(yùn)算符
<code>in</code>運(yùn)算符可以用來(lái)判斷科乎,某個(gè)實(shí)例是否含有某個(gè)屬性,不管是不是本地屬性贼急。
<pre>
  alert("name" in cat1); // true
  alert("type" in cat1); // true
</pre>
<code>in</code>運(yùn)算符還可以用來(lái)遍歷某個(gè)對(duì)象的所有屬性茅茂。
<pre>
  for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }
</pre>
未完,更新中...

文檔轉(zhuǎn)載自阮一峰的網(wǎng)絡(luò)日志

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末太抓,一起剝皮案震驚了整個(gè)濱河市空闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌走敌,老刑警劉巖碴倾,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掉丽,居然都是意外死亡跌榔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門机打,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矫户,“玉大人片迅,你說(shuō)我怎么就攤上這事残邀。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芥挣,是天一觀的道長(zhǎng)驱闷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)空免,這世上最難降的妖魔是什么空另? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蹋砚,結(jié)果婚禮上扼菠,老公的妹妹穿的比我還像新娘。我一直安慰自己坝咐,他們只是感情好循榆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著墨坚,像睡著了一般秧饮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泽篮,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天盗尸,我揣著相機(jī)與錄音,去河邊找鬼帽撑。 笑死泼各,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的油狂。 我是一名探鬼主播历恐,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼专筷!你這毒婦竟也來(lái)了弱贼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磷蛹,失蹤者是張志新(化名)和其女友劉穎吮旅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體味咳,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庇勃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槽驶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责嚷。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掂铐,靈堂內(nèi)的尸體忽然破棺而出罕拂,到底是詐尸還是另有隱情揍异,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布爆班,位于F島的核電站衷掷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柿菩。R本人自食惡果不足惜戚嗅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枢舶。 院中可真熱鬧懦胞,春花似錦、人聲如沸凉泄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旧困。三九已至醇份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吼具,已是汗流浹背僚纷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拗盒,地道東北人怖竭。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像陡蝇,于是被迫代替她去往敵國(guó)和親痊臭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Javascript是一種基于對(duì)象(object-based)的語(yǔ)言登夫,你遇到的所有東西幾乎都是對(duì)象广匙。但是,它又不是...
    云端漫記閱讀 238評(píng)論 0 0
  • 筑城的夏天總是很悶熱恼策,最近天氣的溫度一直都在二十多度左右鸦致,熱得人心發(fā)慌,稍不留意涣楷,就會(huì)犯中暑分唾,后背也總會(huì)被汗水打濕...
    九龍妖閱讀 156評(píng)論 0 0
  • 1.樣本量問(wèn)題 工程效果經(jīng)驗(yàn),壞樣本個(gè)數(shù)至少要是你的特征變量個(gè)數(shù)的10倍以上狮斗;總樣本個(gè)數(shù)要是你的特征變量個(gè)數(shù)的20...
    slade_sal閱讀 1,028評(píng)論 0 0
  • 我沒(méi)有很想你我只是在早上醒來(lái)的時(shí)候碳褒,看看手機(jī)折砸,有沒(méi)有你發(fā)來(lái)的信息捍壤,有沒(méi)有你的未接來(lái)電。 我沒(méi)有很想你我只是在上網(wǎng)的...
    夏末淺笑閱讀 232評(píng)論 1 3
  • 又是連綿的雨专酗,今天還是父親節(jié)睹逃,說(shuō)實(shí)話,我們的父母都沒(méi)什么說(shuō)的祷肯,能給的他們都給了沉填,有的只是我們對(duì)他們的虧欠。 但是佑笋,...
    啊常的簡(jiǎn)書閱讀 608評(píng)論 0 8