JS OOP和强制覆盖

时间:2015-08-06 18:15:51

标签: javascript oop

我正在构建一个具有" buildVisuals()"方法。根据具体情况," buildVisuals()"可以创建一个谷歌地图标记,或填写一个HTML模板,或未来我可能决定做的任何一些事情。但是,如果可视化在任何上下文中都可用,我希望它在创建时执行。

thing = function(){
   var x, y, z;
   this.buildVisuals();
}

...

new thing();

目前,我考虑将此方法留空,并强制使用它的上下文覆盖该方法,以便只有需要地图或其他任何内容的上下文才能拥有所需的功能,并且对于那些上下文不需要立即可视化,他们可以将其留空。

问题:我不知道这种模式叫什么,我不知道它是否比它的价值更麻烦。

2 个答案:

答案 0 :(得分:2)

阅读你的问题时会想到两个想法:
  您可以将buildVisuals方法视为abstract / virtual / mustInherit方法。

// Abstract Base class
function Handler() {
   this.visuals = this.buildVisuals();
}

Handler.prototype = {
  doAThing : function() {
  },
  buildVisuals : function () {
     throw('Error : buildVisuals was not overloaded');
  }
};

// Real class inheriting from the base class
function HTMLHandler() {
    Handler.call(this);
}

HTMLHandler.prototype = Object.create(Handler.prototype);

// overloading (defining) buildVisual
HTMLHandler.prototype.buildVisuals = function() {
   // Real code here
};

// now you create with : 
var myHandler = new HTMLHandler();

// notice that the following line would throw :
// var myThrowingHandler = new Handler(); 

但我更喜欢注射模式,我甚至更喜欢注射处理视觉的类。

//  --------------
function Handler( visualHandlingClass ) {

  this.visualHandler = new visualHandlingClass( /* maybe some params here */ );

}

Handler.prototype = {   ...  } ;    

//  --------------

function HTMLVisualHandler () {
    // class constructor here...
}

HTMLVisualHandler.prototype = {   ...   } ;

//  ---------------
var HandlerUsingHtml = new Handler ( HTMLVisualHandler ) ;

现在如果你想出于某种原因选择字符串,你可能想要使用工厂模式来获取你的实例,但是一个简单的帮助函数就足够了:

function provideHandler( outputKindString ) {
     if (outputKindString == 'html') {
        return new Handler ( HTMLVisualHandler ) ;
     } 
     if (  ....  )
 }

var myHandler = provideHandler( 'html' );

答案 1 :(得分:0)

正如@Barmar所说,它看起来像Factory设计模式。 来自在线book

  

何时使用工厂模式

     
      
  • 当我们处理许多共享相同属性的小对象或组件时。
  •   
  • 当我们需要根据我们所处的环境轻松生成不同的对象实例时。
  •