L'ajout de fonctions d'écouteur à l'objet JavaScript

J'ai le code suivant qui définit un Car. Chaque Car a une couleur, avec une setColor(color) fonction. Je veux ajouter des fonctions d'écouteur qui sont appelés à chaque fois que setColor(color) est appelé, et je veux être en mesure de virer ces fonctions d'écouteur à chaque fois que je veux. Est-ce une solution? Est-il le moyen le plus propre?

function Car() {

    this._color = 'red';
    this._callbacks = {};

    this.setColor = function(color) {
        this._color = color;
        console.log(">>> set car color to " + color);
        if (this._callbacks['setColor']) {
            this._callbacks['setColor']();
        }
    };

    this.addListener = function(functionName, handler) {
        if (this._callbacks[functionName]) {
            var oldCallback = this._callbacks[functionName];
            this._callbacks[functionName] = function() {
                oldCallback();
                handler();
            }
        } else {
            this._callbacks[functionName] = function() {
                handler();
            }
        }
    };


}

var car = new Car();
car.setColor('blue');
car.addListener('setColor', function() { console.log("This is listener # 1"); });
car.setColor('green');
car.addListener('setColor', function() { console.log("This is listener # 2"); });
car.setColor('orange');

De sortie:

>>> setColor to blue
>>> setColor to green
This is listener # 1
>>> setColor to orange
This is listener # 1
This is listener # 2

OriginalL'auteur Andrew | 2012-08-21