2016-04-13 12 views
0

Ich folge diesem Gist für ein Strategie-Design-Muster. https://gist.github.com/Integralist/5736427Javascript Strategie Design Pattern Problem

ich das vor einigen Monaten umgesetzt und die Chrome-Erweiterung werfen hat keine Fehler, wenn ich es implementiert, aber seine jetzt eine

werfen „Uncaught Typeerror: this.strategy ist keine Funktion“

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

es ist seltsam, weil die Funktionen, die auf diesem Code beruhen, noch ausgeführt werden, aber einige andere Codes, die nicht darauf angewiesen sind, sind begrenzt.

Irgendwelche Ideen, wie man es beheben kann?

+0

klingt so, als ob Sie keine Funktion an MessageHandling übergeben –

+0

Meinst du, dass mein anderer Code nicht korrekt an MessageHandling übergeben wird? – Siddartha

+0

wir müssen alles davon sehen – JordanHendrix

Antwort

0

Dies ist in erster Linie über das Objekt, das Sie von MessageHandling erstellen, wenn Sie die richtige Funktion übergeben, während das Objekt zu schaffen es immer funktionieren sollte.

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

Der obige Code wird immer funktionieren, aber wenn Sie die MessageHandling mit Übergabe eines Parameters instanziiert, die keine Funktion ist oder gar nicht ein Parameter übergeben wird, dann wird es beklagen, dass this.strategy keine Funktion ist. Sie müssen also sicherstellen, dass Sie beim Erstellen des Objekts die richtige Funktion an MessageHandling übergeben.

+0

Danke! das war eine große Hilfe. Ich habe ein paar alte MessageHandling-Strategien auskommentiert, die verdächtig waren, wenn sie tatsächlich Funktionen an den Handler in ihrem aktuellen Zustand übergaben. Lebensretter! – Siddartha

0

Sie müssen Ihren vollständigen Code hier veröffentlichen, damit jemand das Problem herausfinden kann. Aber aus dem Ausnahmetext sieht es so aus, als würden Sie eine nicht definierte Strategie oder eine "Variable, die keine Funktion ist" an den Konstruktor übergeben. Das folgende Beispiel wird die gleiche "Uncaught TypeError: this.strategy is not a function Ausnahme geben:

// 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