在Javascript中继承参考值的“正确”方式?

时间:2015-03-03 20:29:38

标签: javascript class oop object inheritance

所以,我对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实例现在都有自己的数组。但是,我只是想知道是否有更“用户友好”的方式吗?假设我稍后要发布这个基本框架供公众使用,人们应该如何确切地知道要覆盖哪些属性以使对象能够正常工作?这看起来有点傻。

我想知道是否有办法这样做而不必让子类覆盖这些类型的参考值? :)

非常感谢!

1 个答案:

答案 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);
    };
}