2008-10-23 68 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也会起飞。如果它们是两个不同的对象,并且位置是对象的属性,那么每个实例(龙)都会有自己的位置。改变一条龙的位置不应该影响另一条龙的位置。