Yegge的原型模型示例如何处理实例变量?

时间:2008-10-23 01:06:25

标签: language-agnostic design-patterns prototype

我喜欢Steve Yegge的Prototype Pattern example,并决定提出一个快速的概念验证示例。

然而,我并没有真正想到的事情。虽然它非常适合动态指定对象的行为,并且是Steve opinionated elf示例的简单解决方案,但我仍然试图找出处理实例变量的最佳方法。

例如,假设我有一个AwesomeDragon对象。然后我想创建一个AwesomeDragonImmuneToFire对象,这样我就可以创建一个AwesomeDragon的新子(AwesomeDragonImmuneToFire从AwesomeDragon继承属性)并将'ImmuneToFire'作为属性值为'true'。到现在为止还挺好。现在让我们说我想在参观附近的农村村庄时发送我的AwesomeDragon对象。这将涉及更新AwesomeDragon的“位置”属性。然而,在我这样做的那一刻,AwesomeDragonImmuneToFire也会起飞。

是在对象创建时覆盖实例值的最佳解决方案,例如将AwesomeDragonImmuneToFire的'position'值'立即'置'到'position'的当前'get'值?

2 个答案:

答案 0 :(得分:10)

它不依赖于您在系统中实际实现继承的方式吗?

例如,在您描述的JavaScript版本中,prototype的{​​{1}}通常是AwesomeDragonImmuneToFire实例,因为您总是在处理实例,对任何特定的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只是a bit of syntactic sugar,使用StudlyCaps作为构造函数只是一个与new一起使用的函数的约定。

关键是每个对象都有一个原型对象链,如果你试图访问一个对象本身不存在的属性,就会根据Yegge对“属性模式”的描述进行检查。< / p>

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

答案 1 :(得分:1)

  

这将涉及更新AwesomeDragon的'position'属性。然而,在我这样做的那一刻,AwesomeDragonImmuneToFire也会起飞。

也许我误解了,但我不确定你为什么认为AwesomeDragonImmuneToFire也会起飞。如果它们是两个不同的对象,并且position是对象的属性,则每个实例(dragon)将具有自己的位置。改变一条龙的位置不应影响另一条龙的位置。