JavaScript ES6装饰器模式
我试图用ES6类语法在JavaScript中实现decorator模式。我的做法如下: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
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();