1

我在 JS 中使用了这种模式进行继承

MyApp.utils = {
    extend: function (subClass, baseClass, subClassMethods) {
        function inheritance() { }
        inheritance.prototype = baseClass.prototype;
        subClass.prototype = new inheritance();
        subClass.prototype.constructor = subClass;
        subClass.baseConstructor = baseClass;
        subClass.superClass = baseClass.prototype;

        if (subClassMethods == null) return;

        for (var index in subClassMethods) {
            subClass.prototype[index] = subClassMethods[index];
        }
    }
};

你像这样使用它

MyApp.utils.extend(SubClass, BaseClass, {
    subMethodOne: function() {        
    }
});

这工作得很好,代码也很简单,但它不适用于多重继承,因为构造函数调用将是子类而不是基类,这将产生堆栈溢出

多重继承的最佳模式是什么?它必须支持原型和每个类中单独的构造函数逻辑

JSFiddle: http: //jsfiddle.net/HcPhL/1/ 它会崩溃FF所以要小心:D

4

2 回答 2

1

javascript中的继承是基于原型的。这意味着对象相互继承,而不是类。与其尝试使用你知道的其他编程语言的习语,我建议你学习 javascript 自己的习语。我发现使用模块、克隆和复制功能(因为函数是对象)比 javascript 中的经典继承有用得多。

也就是说,您想要做的事情可以通过以下方式完成:

我们希望ABC类的对象继承

  1. 创建一个新对象,将其命名为 A
  2. 迭代 B 的每个属性(使用 for... in 循环)并将其分配给 A。
  3. 迭代 C 的每个属性(使用 for... in 循环)并将其分配给 A,在这里您可能需要考虑您对冲突解决的看法(意味着您希望优先考虑谁的方法 B 或 C。

有很多带有扩展功能的开源 javascript 库,您可以在那里查看实现。Douglas Crockford 还有一篇关于如何在这里完成继承的基本文章这里是一篇关于 javascript 多重继承的文章

我假设你想要完成的是代码重用,我建议你看看 Addy Osmani 的这本免费书学习 javascript 设计模式。尤其是模块模式。

于 2012-09-03T10:03:33.717 回答
0

使用 mixins 模式或装饰器模式来支持多重继承。如果你需要,我可以给你一个详细的实现

于 2014-02-06T08:49:13.440 回答