Email:longsu2010 at yeah dot net 今天先不寫原型繼承,先看一個(gè)誤區(qū):“改變構(gòu)造函數(shù)的原型(prototype)將魔法般的(magically)更新新對(duì)象和已經(jīng)存在的對(duì)象……” 這是完全錯(cuò)誤的,不要相信解釋JavaScript(包括任何事情)時(shí)使用了魔法(magic)這個(gè)單詞的作者。
這段代碼將alert "2" 和 "2",這似乎證實(shí)了上面引號(hào)中的定義,因?yàn)閤對(duì)象在創(chuàng)建后增加了屬性prop。魔法般的?其實(shí)不是,看下面的例子。
這段代碼將alert "undefined" 和 "2"。在第一個(gè)例子中對(duì)象x和y均有屬性prop。他們是隱藏在對(duì)象所引用的原型中(隱藏? 因?yàn)橹挥薪馕銎骺梢栽L問它)。當(dāng)訪問prop屬性的時(shí)候JavaScript無法在對(duì)象本身中找到,之后會(huì)搜索原型鏈,在原型鏈中找到并返回。這對(duì)于一個(gè)程序員來說是透明的。當(dāng)你向原型中增加一個(gè)新屬性的時(shí)候?qū)ο髕是不改變的。當(dāng)你訪問prop屬性的時(shí)候會(huì)在更新后的原型中找到它。 第二個(gè)例子中我們將原型改為一個(gè)新對(duì)象,而x依然使用舊的原型,但是y使用的是新原型,所以x和y不共享原型。很明顯舊原型不存在prop屬性。更糟糕的是,現(xiàn)在你丟失了唯一的訪問點(diǎn)(無法訪問舊原型了)。雖然創(chuàng)建對(duì)象的語法相同,但是他們是不同的。 另外,眾所周知,每一個(gè)對(duì)象有一個(gè)constructor屬性指向構(gòu)造函數(shù)。但是像prop那樣,constructor屬性存在于原型中而不是對(duì)象本身。 重寫原型的同時(shí)也重寫了constructor屬性,如下: 因此當(dāng)你重寫原型后constructor屬性是不可信的,但是重寫原型又是JavaScript中的重要技術(shù)。譯者: 本文講述了JavaScript中重寫原型后原型不一致的問題和constructor屬性指向問題。動(dòng)態(tài)修改原型對(duì)象不會(huì)在已有對(duì)象中生效。重寫原型對(duì)象后constructor的指向?qū)⑹遣豢尚诺?,可以在重寫原型后將constructor屬性重新賦值。如 function C(); C.prototype = {}; C.prototype.constructor = C; 相關(guān)文章: JavaScript中的對(duì)象(一) |
|