2012-09-03 27 views
1

我在JS使用这个模式来继承的Javascript多重继承模式

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

+0

如果你打开一个现有的继承模拟方法具有占地面积小,我都用,效果很好这样的:http://ejohn.org/blog/simple- JavaScript的继承/ – David

+0

谢谢,在小提琴重覆方法和调用基础方法尝试它,这是可能的吗? http://jsfiddle.net/xFPy4/ – Anders

+0

它可以(将)重写原型。 'this._super()'调用同名的超类方法,它不是超本身的引用。 HTTP://的jsfiddle。net/xFPy4/1/ – David

回答

1

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

这就是说,你想做的事,可以实现以下方式是什么:

我们希望一个ç排序对象的继承

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

有很多开源的javascript库有一个扩展函数,你可以查看那里的实现。道格拉斯克罗克福德还对如何完成继承herehere is an article about javascript multiple inheritance

我假设你要完成什么码再用一个基本的文章,我建议你看一下这个免费书籍由阿迪·奥斯马尼learning javascript design patterns。特别是模块模式。

0

使用混入图案或装饰图案,以支持多重继承。我可以给你一个详细的实施,如果你需要一个