2

对于 JavaScript 项目,我们希望引入对象继承以减少代码重复。但是,我不能完全按照我想要的方式工作,需要一些帮助。

我们使用模块模式。假设有一个超级元素:

a.namespace('a.elements.Element');
a.elements.Element = (function() {
    // public API -- constructor
    Element = function(properties) {
        this.id = properties.id;
    };

    // public API -- prototype
    Element.prototype = {
        getID: function() {
            return this.id;
        }
    };

    return Element;
}());

还有一个继承自这个超级元素的元素:

a.namespace('a.elements.SubElement');
a.elements.SubElement = (function() {
    // public API -- constructor
    SubElement = function(properties) {
        // inheritance happens here
        // ???
        this.color = properties.color;
        this.bogus = this.id + 1;
    };

    // public API -- prototype
    SubElement.prototype = {
        getColor: function() {
            return this.color;
        }
    };

    return SubElement;
}());

您会注意到我不太确定如何实现继承本身。在构造函数中,我必须能够将参数传递给超级对象构造函数并创建一个超级元素,然后用于创建继承的元素。我需要一种(舒适的)可能性来访问新对象的构造函数中的超级对象的属性。理想情况下,我可以对超级对象进行操作,就好像它是新对象的一部分一样。

我还希望能够创建一个新的 SubElement 并调用getID()它。

我想要完成的似乎是传统的基于类的继承。但是,我想使用原型继承来做到这一点,因为那是 JavaScript 方式。这甚至可行吗?

提前致谢!

编辑:修复了评论中建议的私有变量的使用。EDIT2:代码的另一个更改:重要的id是可以从SubElement.

4

2 回答 2

1

试试这段代码(继承方法取自这里):

function inherit(proto) {
  function F() {};     
  F.prototype = proto;
  return new F();
}

a.namespace('a.elements.SubElement');
a.elements.SubElement = (function() {
    // private properties
    var color;

    // public API -- constructor
    SubElement = function(properties) {
        color = properties.color;
    };

    //inherit from parent
    SubElement.prototype = inherit(a.elements.Element);

    //add new methods to the prototype

    SubElement.prototype.getColor = function() {
            return color;
    }

    SubElement.prototype.doSomethinkWithID = function() {
            var id = this.getID();
    }

    return SubElement;
}());
于 2012-06-25T15:04:08.913 回答
1

如果您愿意,可以使用 JavaScript 的原型继承来进行类类继承。有关完整示例和讨论,请参阅此其他答案,您可以轻松地将其融入您的模式。

于 2012-06-25T14:41:25.733 回答