所以,我对Javascript很新,我正在尝试学习一些OOP原则。
我遇到了一个问题。所以,我基本上是为HTML画布创建一个场景图,这意味着我需要一个递归结构。每个节点必须能够包含子节点数组。所以,假设我有一个基本节点对象,如:
// Shape class (It is part of the BNBeagle namespace)
Shape: function () {
this.children = [];
},
没问题。
然后,我继续为一个小样本游戏创建我自己的子类,它可能是这样的:
function PlayerShip() {
// drawShape is a method that's overrided from the Shape class
this.drawShape = function () {
BNBeagle.canvasContext.fillStyle = "#FF0000";
BNBeagle.canvasContext.fillRect(-25, -25, 50, 50);
};
};
PlayerShip.prototype = new BNBeagle.Shape();
我现在面临的问题是,从我从研究中收集的内容来看,做这样的原型继承会产生一个问题,比如数组这样的参考值,我很快就发现了。基本上,我发现所有我的PlayerShip实例将从原型中共享相同的“子”数组,这显然是不好的。
从我在互联网上找到的,解决方案似乎是覆盖子类中的属性,基本上通过这样做:
function PlayerShip() {
this.children = [];
// drawShape is a method that's overrided from the Shape class
this.drawShape = function () {
BNBeagle.canvasContext.fillStyle = "#FF0000";
BNBeagle.canvasContext.fillRect(-25, -25, 50, 50);
};
};
只需添加PlayerShip的children属性即可。现在,这一切都运行良好,所有PlayerShip实例现在都有自己的数组。但是,我只是想知道是否有更“用户友好”的方式吗?假设我稍后要发布这个基本框架供公众使用,人们应该如何确切地知道要覆盖哪些属性以使对象能够正常工作?这看起来有点傻。
我想知道是否有办法这样做而不必让子类覆盖这些类型的参考值? :)
非常感谢!
答案 0 :(得分:2)
使用Object.create
创建一个原型对象,它不会调用构造函数,因此只包含原型:
PlayerShip.prototype = Object.create(BNBeagle.Shape.prototype);
然后你可以在子1的开头调用父构造函数:
function PlayerShip() {
// Call parent constructor with appropriate `this`
BNBeagle.Shape.call(this);
// drawShape is a method that's overrided from the Shape class
this.drawShape = function () {
BNBeagle.canvasContext.fillStyle = "#FF0000";
BNBeagle.canvasContext.fillRect(-25, -25, 50, 50);
};
}