首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript中模板方法

javascript中模板方法
EN

Stack Overflow用户
提问于 2010-10-08 23:08:38
回答 1查看 4.4K关注 0票数 5

我想用javascript实现模板方法模式。

我有一个带有一些子类的PropertyDecorator : OpenButtonDecorator、SeeButtonDecorator等。我希望在属性装饰器中有下一个函数:

代码语言:javascript
复制
var build = function(){
   decorate(); //Abstract in PropertyDecorator, defined in subclasses
   return le.build();
}

我怎样才能让这个场景工作呢?也许我实现了错误的继承:S (对此也有帮助:)

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-10 20:04:53

Javascript是一种动态类型的、基于原型的语言。模板方法是一种设计模式,因此独立于语言,但其实现可能因语言而异。

对于javascript,以及其他动态类型的语言,比如ruby,抽象类和接口没有多大意义,因为动态链接是通过委托发生的。(方法调用被传播到继承树中的更高级别,直到原型可以处理该请求)。这与鸭子类型相结合,意味着任何方法都可能在任何实例上被调用,从而避免了对显式约定的需要,在基于类的语言中,显式约定是由在特定类型上可见的那些声明的方法定义的。

因此,为了实现该模式,只需在父类的原型构建方法(该方法将是模板)上调用一个不存在的方法,并在子类上简单地实现该方法:

代码语言:javascript
复制
function PropertyDecorator()
{
   this.build = function()
   {
      var decoration=this.decorate();
      return "The decoration I did: "+decoration;
   };
}

//we set the parent (those prototype that instances of this class will delegate calls to) 
OpenButtonDecorator.prototype = new PropertyDecorator();
function OpenButtonDecorator()
{
   this.decorate = function()
   {
     return "open button";
   };
}


SeeButtonDecorator.prototype = new PropertyDecorator();
function SeeButtonDecorator()
{
   this.decorate = function()
   {
      return "see button";
   };
}



var decorators=Array(new SeeButtonDecorator(),new OpenButtonDecorator());
for (var decorator in decorators){
    document.writeln(decorators[decorator].build());
}

方法分派是这样发生的:

  • 实例是否调用了该方法?
    • 否->委托调用父对象(其原型)并重复。
    • 是->在隐式对象(在beginning).

中接收调用的对象)的上下文中执行方法主体

因此,当调用新的SeeButtonDecorator().build()时,它首先会尝试在实例上执行build方法。由于它没有在实例中定义,方法调用将被委托给实例父实例,在本例中,实例父实例的SeeButtonDecorator原型也没有获得该方法,因此它将把调用委托给它的父实例(PropertyDecorator)。PropertyDecorator,具有build()方法。

代码语言:javascript
复制
function PropertyDecorator()
{
   this.build = function()
   {
      var decoration=this.decorate();
      return "The decoration I did: "+decoration;
   };
}

在执行它时,将在新的SeeButtonDecorator()上下文中计算build方法的主体。实例本身没有decorate()方法,因为它是在SeeButtonDecorator()函数(其原型)中定义的。好吧,这一次调用将被委托给实例原型,它最终将获得一个修饰符()方法:

代码语言:javascript
复制
function SeeButtonDecorator()
{
   this.decorate = function()
   {
      return "see button";
   };
}

该方法将在实例的上下文中再次执行,并将返回字符串,在调用堆栈中回退,直到返回

代码语言:javascript
复制
The decoration I did: see button
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3891861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档