6

我喜欢 Steve Yegge 的原型模式示例,并决定创建一个快速概念验证示例。

然而,我并没有真正考虑清楚。虽然它非常适合动态指定对象的行为并且是史蒂夫固执己见的精灵示例的简单解决方案,但我仍在尝试找出处理实例变量的最佳方法。

例如,假设我有一个 AwesomeDragon 对象。然后我想制作一个 AwesomeDragonImmuneToFire 对象,因此我制作了 AwesomeDragon 的新子代(AwesomeDragonImmuneToFire 继承了 AwesomeDragon 的属性)并将“ImmuneToFire”作为值为“true”的属性。到现在为止还挺好。现在假设我想发送我的 AwesomeDragon 对象去参观附近的农村。这将涉及更新 AwesomeDragon 的“位置”属性。然而,当我这样做的那一刻 AwesomeDragonImmuneToFire 也会起飞。

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

4

2 回答 2

10

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

例如,在您所描述的 JavaScript 版本中,prototypeforAwesomeDragonImmuneToFire通常是 an 的实例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只是一点语法糖,将 StudlyCaps 用于构造函数只是对旨在与new.

关键是每个对象都有一个原型对象链,如果您尝试访问对象本身不包含的属性,则会根据 Yegge 对“属性模式”的描述进行检查。

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

于 2008-10-23T01:42:56.477 回答
1

这将涉及更新 AwesomeDragon 的“位置”属性。然而,当我这样做的那一刻 AwesomeDragonImmuneToFire 也会起飞。

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

于 2008-10-23T20:53:49.007 回答