JavaScript ES6装饰器模式

JavaScript ES6装饰器模式,javascript,decorator,es6-class,Javascript,Decorator,Es6 Class,我试图用ES6类语法在JavaScript中实现decorator模式。我的做法如下: class Dish{ constructor(){} getPrice(){} getDes(){} } class Steak extends Dish{ constructor(){ super(); } getPrice(){ return 13; } getDes(){ return "Steak"; } } class SideDis

我试图用ES6类语法在JavaScript中实现decorator模式。我的做法如下:

class Dish{
  constructor(){}
  getPrice(){}
  getDes(){}
}

class Steak extends Dish{
  constructor(){
    super();
  }
  getPrice(){
    return 13;
  }
  getDes(){
    return "Steak";
  }
}

class SideDish extends Dish{
  constructor(dish){
    super();
    this.dish = dish;
  }
  getPrice(){
    return super.getPrice();
  }
  getDes(){
    return super.getDes();
  }
}

class Pommes extends SideDish{
  constructor(dish){
    super(dish);
  }
  getPrice(){
    return super.getPrice() +5;
  }
  getDes(){
    return super.getDes() + " Pommes";
  }
}
当我打电话的时候

var dish = new Pommes(new Steak());
dish.getPrice();

我得到的结果是NaN,但我希望是“18”。我的错在哪里

您忘记了
SideDish.getPrice()
中的
return


您还忘记了
SideDish.getDes()
中的
return
,因此问题似乎出在您的父装饰程序
SideDish
上。目前看来:

class SideDish extends Dish{
   constructor(dish){
     super();
     this.dish = dish;
  }
  getPrice(){
     return super.getPrice();
  }
  getDes(){
     return super.getDes();
  }
}
带有
盘的
具有:

getPrice(){}
这意味着对于
Pommes
上的方法:

  getPrice(){
     return super.getPrice() +5;
  }
super.getPrice()
正在返回
undefined
(从其直接父项
SideDish
,转发到
Dish
),而不是您所期望的
Steak.getPrice()

当我更新
侧盘
以使用附加(装饰)对象时,如:

class SideDish extends Dish{
  constructor(dish){
     super();
     this.dish = dish;
  }
  getPrice(){
     return this.dish.getPrice();
  }
  getDes(){
     return this.dish.getDes();
  }
}
然后跑

var dish = new Pommes(new Steak());
dish.getPrice();

正如所料,我得到了18个。

那么你的
副菜
方法(你使用
super
Pommes
调用)不会
返回任何东西。
getPrice(){super.getPrice();}
没有任何意义。如果您除了超级实现之外什么都不做,只需省略该方法,以便直接继承它。它还调用了
Dish.prototype.getPrice
,它总是返回
未定义的
——这没有帮助。我很确定
侧盘
有问题。如果我尝试
var side_dish=new SideDish(new Steak());配菜。getPrice()我得到
未定义的
(这是在添加所提到的缺少的返回之后)。这就解释了
NaN
,因为
undefined+5
会导致
NaN
,但我不知道为什么
SideDish::getPrice
返回undefined而不是super(可能是因为它是从
Dish
调用它,而不是从
Steak
?)哎呀,天哪,对不起冒犯了殿下。@Mike,我投票给你的答案是为了弥补Ele的坏态度。你能帮我回答这个问题吗?@kshetline非常乐意,但不幸的是,这不算什么,因为我的名声还不到15岁。所以基本上就是告诉我,如果我对你的答案投赞成票。对不起,我要投票给所有人!你有一票!你就可以得到一张赞成票!
var dish = new Pommes(new Steak());
dish.getPrice();