【翻譯】javascript中的prototype

原文地址:http://dailyjs.com/2012/05/20/js101-prototype/

在花費了很多年研究面向?qū)ο缶幊讨螅朐趈avascript使用是令人失望的初橘。主要是從根源上缺少一個class這樣的關(guān)鍵詞迹恐。然而契耿,javascript的設(shè)計不會成為阻礙 -- 精通它基于原型的繼承椒惨,將會加深你對該語言的理解碌奉。

首先我們需要弄清楚面向?qū)ο笈c面向類編程的區(qū)別翁都。Javascript提供了我們需要的工具來完成大多數(shù)語言的類可以做的事情 -- 我們只需要學(xué)習(xí)如何正確使用它碍论。

我們簡單的看一下prototype屬性,看它如何深化我們對javascript的了解柄慰。

prototype屬性(The prototype Property)

prototype屬性是一個內(nèi)部屬性鳍悠,它被用于實現(xiàn)繼承税娜。我們這里的“繼承”是一種特定的繼承形式。因為狀態(tài)和方法都由對象承載藏研,所以我們可以說結(jié)構(gòu)敬矩、行為和狀態(tài)都是繼承的。這與基于類的語言形成對比蠢挡,其狀態(tài)由實例承載弧岳,而方法由類承載。

構(gòu)造函數(shù)就是一個具有屬性的方法业踏,該屬性被稱作prototype:

function Animal() {
    
}
console.log(Animal.protype);

{}標(biāo)識Animal具有一個prototype屬性缩筛,但是沒有用戶定義它。我們可以隨意添加值和方法:

function Animal() {  
}

Animal.prototype.type = 'Unknown';  
Animal.prototype.weight = 0;  
Animal.prototype.weightUnits = 'kg';

Animal.prototype.toString = function() {  
  return this.type + ', ' + this.weight + this.weightUnits;
};

var molly = new Animal();  
molly.type = 'Dog';  
molly.weight = 28;

console.log(molly.toString());  // Dog, 28kg

這將會輸出"Dog, 28kg"堡称。我們可以使用對象字面量將這些賦值分組:

function Animal() {  
}

Animal.prototype = {  
  type: 'Unknown',
  weight: 0,
  weightUnits: 'kg',

  toString: function() {
    return this.type + ', ' + this.weight + this.weightUnits;
  }
};

這樣就和你熟悉的類的方式差異不是很大瞎抛。

動態(tài)原型(Dynamic Prototypes)

通過指定值可以給對象動態(tài)的添加屬性。

var molly = new Animal()  
  , harley = new Animal();

molly.type = 'Dog';  
molly.weight = 28;

harley.type = 'Dog';  
harley.weight = 38;  
harley.name = 'Harley';

console.log(molly);  
console.log(harley);

// { type: 'Dog', weight: 28 }
// { type: 'Dog', weight: 38, name: 'Harley' }

在這里添加name屬性只影響了實例却紧。然而桐臊,構(gòu)造函數(shù)的屬性可以被改變,并且將影響用這個原型創(chuàng)建的對象晓殊。

Animal.prototype.weightUnits = 'oz';

console.log(molly.toString())  
// Now displays 'Dog, 28oz'

這就是為什么人們只會擴展自己的庫而不去改變內(nèi)置原型断凶,或者說只有這么做才是安全的。我們完全有可能改變對象巫俺,例如使用String的內(nèi)置方法做一些不安全的事情:

String.prototype.match = function() {  
  return true;
};

console.log('alex'.match(/1234/)); 

輸出為true,所以現(xiàn)在我成功的破壞了很多程序都在依賴的基礎(chǔ)方法认烁。
改變內(nèi)置原型也不一定全部是壞的;我們使用它有用的東西介汹,如修補支持更舊版本的ECMAScript在舊版的瀏覽器却嗡。

如果我們替換prototype屬性會發(fā)生什么?

var molly = new Animal()  
  , harley;

molly.type = 'Dog';  
molly.weight = 28;

Animal.prototype = {  
  toString: function() {
    return '...';
  }
};

harley = new Animal;  
harley.type = 'Dog';  
harley.weight = 38;

console.log(molly.toString());  
console.log(harley.toString());

// Dog, 28kg
// ...

盡管事實上改變原型會影響所有實例嘹承,但是完全替換構(gòu)造函數(shù)的原型不會影響舊實例窗价。為什么?實例具有對原型的引用叹卷,而不是離散拷貝撼港。想象它就是這樣:使用new關(guān)鍵字創(chuàng)建的每個實例都鏈接到原始原型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骤竹,一起剝皮案震驚了整個濱河市帝牡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒙揣,老刑警劉巖靶溜,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸣奔,居然都是意外死亡墨技,警方通過查閱死者的電腦和手機惩阶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扣汪,“玉大人断楷,你說我怎么就攤上這事≌副穑” “怎么了冬筒?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茅主。 經(jīng)常有香客問我舞痰,道長,這世上最難降的妖魔是什么诀姚? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任响牛,我火速辦了婚禮,結(jié)果婚禮上赫段,老公的妹妹穿的比我還像新娘呀打。我一直安慰自己,他們只是感情好糯笙,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布贬丛。 她就那樣靜靜地躺著,像睡著了一般给涕。 火紅的嫁衣襯著肌膚如雪豺憔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天够庙,我揣著相機與錄音恭应,去河邊找鬼。 笑死首启,一個胖子當(dāng)著我的面吹牛暮屡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毅桃,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼准夷!你這毒婦竟也來了钥飞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤衫嵌,失蹤者是張志新(化名)和其女友劉穎读宙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楔绞,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡结闸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年唇兑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桦锄。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡扎附,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出结耀,到底是詐尸還是另有隱情留夜,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布图甜,位于F島的核電站碍粥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黑毅。R本人自食惡果不足惜嚼摩,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矿瘦。 院中可真熱鬧低斋,春花似錦、人聲如沸匪凡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病游。三九已至唇跨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衬衬,已是汗流浹背买猖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滋尉,地道東北人玉控。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像狮惜,于是被迫代替她去往敵國和親高诺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持碾篡,譯者再次奉上一點點福利:阿里云產(chǎn)品券虱而,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,987評論 4 14
  • 特別說明开泽,為便于查閱牡拇,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 1,121評論 0 4
  • 本章內(nèi)容 理解對象屬性 理解并創(chuàng)建對象 理解繼承 面向?qū)ο笳Z言有一個標(biāo)志,那就是它們都有類的概念,而通過類可以創(chuàng)建...
    悶油瓶小張閱讀 841評論 0 1
  • 我不知道合適的人什么時候到來,所以我只能等剔蹋,在等的時候讓自己變得更加優(yōu)秀旅薄,你很好,但我也不差滩租。我在的城市今天是個陰...
    我在南方的城市閱讀 157評論 0 0
  • 本篇不同于《素問·上古天真論》赋秀、《太極拳論》、《洗髓經(jīng)》等古典梵文經(jīng)著律想,系屬一片尋常于百姓修煉猎莲、提融、和會的平白文...
    酒驍仙閱讀 682評論 8 4