我喜欢Steve Yegge的Prototype Pattern example,并决定提出一个快速的概念验证示例。
然而,我并没有真正想到的事情。虽然它非常适合动态指定对象的行为,并且是Steve opinionated elf示例的简单解决方案,但我仍然试图找出处理实例变量的最佳方法。
例如,假设我有一个AwesomeDragon对象。然后我想创建一个AwesomeDragonImmuneToFire对象,这样我就可以创建一个AwesomeDragon的新子(AwesomeDragonImmuneToFire从AwesomeDragon继承属性)并将'ImmuneToFire'作为属性值为'true'。到现在为止还挺好。现在让我们说我想在参观附近的农村村庄时发送我的AwesomeDragon对象。这将涉及更新AwesomeDragon的“位置”属性。然而,在我这样做的那一刻,AwesomeDragonImmuneToFire也会起飞。
是在对象创建时覆盖实例值的最佳解决方案,例如将AwesomeDragonImmuneToFire的'position'值'立即'置'到'position'的当前'get'值?
答案 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)将具有自己的位置。改变一条龙的位置不应影响另一条龙的位置。