2008-10-23 42 views
6

我喜歡Steve Yegge的Prototype Pattern example,並決定掀起一個概念示例的快速證明。Yegge的原型模式示例如何處理實例變量?

但是,我並沒有真正想過。儘管動態指定對象的行爲非常好,並且對Steve的opinionated elf示例很簡單,但我仍然試圖找出處理實例變量的最佳方法。

例如,假設我有一個AwesomeDragon對象。然後我想創建一個AwesomeDragonImmuneToFire對象,這樣我就可以讓AwesomeDragon(AwesomeDragonImmuneToFire從AwesomeDragon繼承屬性)的新孩子和'put'「ImmuneToFire」作爲值爲'true'的屬性。到現在爲止還挺好。現在讓我們說我想在附近的農民村莊參觀我的AwesomeDragon對象。這將涉及更新AwesomeDragon的'位置'屬性。然而,我做這個AwesomeDragonImmuneToFire的那一刻也會起飛。

是創建對象時覆蓋實例值的最佳解決方案,例如,立即將AwesomeDragonImmuneToFire上的'position'值'放'到'position'的當前'get'值上?

回答

10

這不是取決於您如何在系統中實際實現繼承嗎?

例如,在你描述一個JavaScript版本中,prototypeAwesomeDragonImmuneToFire通常是AwesomeDragon實例,因爲你會始終與實例工作,它不會不管你做什麼任何特定AwesomeDragon

function Dragon() 
{ 
    this.position = "starting point"; 
} 

function AwesomeDragon() 
{ 
    this.awesome = true; 
} 
AwesomeDragon.prototype = new Dragon(); 

function AwesomeDragonImmuneToFire() 
{ 
    this.immuneToFire = true; 
} 
AwesomeDragonImmuneToFire.prototype = new AwesomeDragon(); 

>>> var awesome = new AwesomeDragon(); 
>>> var immune = new AwesomeDragonImmuneToFire(); 
>>> awesome.position = "flying above village"; 
>>> immune.position; 
"starting point" 
>>> immune.awesome 
true 

在這個例子中,沒有類和所有實例都只是碰巧知道該函數用於構建他們的Object實例。 new只是a bit of syntactic sugar和使用StudlyCaps的構造函數只是一個功能的慣例,旨在與new一起使用。

關鍵是每個對象都有一個原型對象鏈,如果您試圖訪問該對象本身並不擁有的屬性,則會檢查這些原型對象鏈,按照Yegge對「屬性模式」的說明。

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model

+0

我認爲原型的想法是沒有真正的類 - 只有原型類的實例。混合原理可以工作好,但我擔心你不得不檢查對象方法和原型屬性。 – 2008-10-23 02:19:53

+0

感謝您的反饋意見 - 我喜歡您的榜樣和upvoted。 – 2008-10-23 02:20:48

1

這將涉及更新AwesomeDragon的 '位置' 屬性。然而,我做這個AwesomeDragonImmuneToFire的那一刻也會起飛。

也許我誤解了,但我不確定爲什麼你覺得AwesomeDragonImmuneToFire也會起飛。如果它們是兩個不同的對象,並且位置是對象的屬性,那麼每個實例(龍)都會有自己的位置。改變一條龍的位置不應該影響另一條龍的位置。