我在阅读了http://javascript.crockford.com/prototypal.html之后,对原型继承进行了一些尝试,并且在理解如何在类似于经典继承的方式中使用它方面遇到了一些问题。也就是说,除非子对象覆盖它们,否则由原型继承的所有函数和变量本质上都变成了静态内容。请考虑以下代码段:
var Depot = {
stockpile : [],
loadAmmo : function (ammoType) {
this.stockpile.push(ammoType);
}
};
var MissileDepot = Object.create(Depot);
var GunDepot = Object.create(Depot);
stockpile
和loadAmmo
应该放在原型中,因为MissileDepot和GunDepot都有它们。然后我们运行:
MissileDepot.loadAmmo("ICBM");
MissileDepot.loadAmmo("Photon Torpedo");
alert(MissileDepot.stockpile); // outputs "ICBM,Photon Torpedo"
alert(GunDepot.stockpile); // outputs "ICBM,Photon Torpedo"
这是预期的,因为
MissileDepot
和 GunDepot
都没有 stockpile
或 loadAmmo
属性,所以 JavaScript 查找它们的共同祖先来继承这些属性。当然,我可以手动设置 GunDepot 的 stockpile 属性,正如预期的那样,解释器就不再需要查找继承链了。
GunDepot.stockpile = ["Super Nailgun", "Boomstick"];
alert(GunDepot.stockpile); // outputs "Super Nailgun,Boomstick"
但这不是我想要的。如果这是经典继承(比如Java),loadAmmo将独立地在MissileDepot和GunDepot的库存中操作,作为实例方法和实例变量。我希望我的原型声明对子对象通用的内容,而不是被它们共享的。 因此,也许我完全误解了原型继承背后的设计原则,但我不知道如何实现我刚才描述的内容。有什么提示吗?提前致谢!