Javascript策略设计模式问题

Javascript Strategy Design Pattern issue

本文关键字:问题 设计模式 策略 Javascript      更新时间:2024-05-20

我遵循策略设计模式的要点。https://gist.github.com/Integralist/5736427

我在几个月前实现了这个,chrome扩展在我实现它时没有抛出任何错误,但现在它抛出了

"未捕获类型错误:this.strategy不是函数"

var MessageHandling = function(strategy) {
    this.strategy = strategy;
};
MessageHandling.prototype.greet = function() {
    return this.strategy();
};

这很奇怪,因为依赖于此代码的函数仍然运行,但其他不依赖于它的代码是有限的。

有什么解决办法吗?

这主要是关于您从MessageHandling创建的对象,如果您在创建对象时传递了正确的函数,它应该始终有效。

var MessageHandling = function(strategy) {
    this.strategy = strategy;
};
MessageHandling.prototype.greet = function() {
    return this.strategy();
};
var m = new MessageHandling(function(){console.log('hello');});
m.greet();

上面的代码总是有效的,但如果您通过传递一个不是函数的参数或根本不传递参数来实例化MessageHandling,那么它会抱怨this.strategy不是函数。因此,您需要确保在创建MessageHandling的对象时将正确的函数传递给它。

您需要在此处发布完整的代码,以便有人解决问题。但从异常文本来看,似乎是在向构造函数传递未定义的策略或"不是函数的变量"。以下示例将给出相同的"Uncaught TypeError: this.strategy is not a function异常:

// This is the Greeter constructor.
var Greeter = function(strategy) {
    this.strategy = strategy;  
};
// Greeter provides a greet function that is going to
// greet people using the Strategy passed to the constructor.
Greeter.prototype.greet = function() {
  return this.strategy();
};
// Here are a couple of Strategies to use with our Greeter.
var politeGreetingStrategy = function() {
 console.log("Hello."); 
};
var friendlyGreetingStrategy = function() {
  console.log("Hey!");
};
var boredGreetingStrategy = function() {
  console.log("sup.");
};
var undefinedStrategy; //Not a function variable
// Let's use these strategies!
var politeGreeter   = new Greeter(politeGreetingStrategy);
var friendlyGreeter = new Greeter(friendlyGreetingStrategy);
var boredGreeter    = new Greeter(boredGreetingStrategy);
var wrongGreeter = new Greeter(undefinedStrategy); //No such strategy defined
politeGreeter.greet();   //=> Hello.
friendlyGreeter.greet(); //=> Hey!
boredGreeter.greet();    //=> sup.
wrongGreeter.greet();   //-> uncaught type