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

Mat*_*ell 6 language-agnostic design-patterns prototype

我喜欢Steve Yegge的原型模型示例,并决定掀起一个快速的概念验证示例.

但是,我并没有真正想到的事情.虽然它非常适合动态指定对象的行为,并且是Steve的自以为是的精灵示例的简单解决方案,但我仍然在努力找出处理实例变量的最佳方法.

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

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

Jon*_*nan 10

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

例如,在你描述一个JavaScript版本中,prototype对于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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,没有类,所有实例只是Object碰巧知道用于构造它们的函数的实例.new只是一些语法糖,使用StudlyCaps作为构造函数只是一个用于函数的约定new.

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

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