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

问题描述 投票:6回答:2

[我喜欢史蒂夫·叶格(Steve Yegge)的Prototype Pattern example,并决定提出一个概念证明的快速示例。

但是,我并没有真正考虑到问题。虽然它对于动态指定对象的行为非常有用,并且是Steve opinionated elf示例的简单解决方案,但我仍在尝试找出处理实例变量的最佳方法。

例如,假设我有一个AwesomeDragon对象。然后,我想制作一个AwesomeDragonImmuneToFire对象,以便制作一个AwesomeDragon的新子代(AwesomeDragonImmuneToFire继承了AwesomeDragon的属性),并将“ ImmuneToFire”设置为值为“ true”的属性。到目前为止,一切都很好。现在,假设我要在附近的农民村庄游览中发送我的AwesomeDragon对象。这将涉及更新AwesomeDragon的'position'属性。但是,当我这样做时,AwesomeDragonImmuneToFire也将起飞。

是创建对象时覆盖实例值的最佳解决方案,例如立即将AwesomeDragonImmuneToFire上的“位置”值“放置”到当前“位置”的“获取”值?

design-patterns language-agnostic prototype-pattern
2个回答
10
投票

这不取决于您实际上如何在系统中实现继承吗?

例如,在您所描述的JavaScript版本中,prototypeAwesomeDragonImmuneToFire通常为AwesomeDragoninstance,并且由于您始终使用实例,因此不管您对任何特定的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


1
投票

这将涉及更新AwesomeDragon的'position'属性。但是,当我这样做时,AwesomeDragonImmuneToFire也将起飞。

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.