対象に向けたJS(6)カスタム異常とイベント

3914 ワード

1カスタム異常
JavaScriptにはError、Type Errer、SyntxErrorなどの異常が内蔵されています.これらの異常は運行時に作成されます.各異常は未確認です.普通のオブジェクトは、例外的な文の中で使用できます.したがって、カスタムの異常を作成し、投げたり、捕らえることができます.カスタム異常の優れた手法はJavaScriptの標準的なErrオブジェクトを継承することです.
function BaseException() {}
BaseException.prototype = new Error();
BaseException.prototype.constructor = BaseException;
BaseException.prototype.toString = function () {
    // note that name and message are properties of Error
    return this.name + ": "+this.message;
};

function NegativeNumberException(value) {
    this.name = "NegativeNumberException";
    this.message = "Negative number!Value: "+value;
}
NegativeNumberException.prototype = new BaseException();
NegativeNumberException.prototype.constructor = NegativeNumberException;

function EmptyInputException() {
    this.name = "EmptyInputException";
    this.message = "Empty input!";
}
EmptyInputException.prototype = new BaseException();
EmptyInputException.prototype.constructor = EmptyInputException;
var InputValidator = (function () {
        var InputValidator = {};
        InputValidator.validate = function (data) {
            var validations = [validateNotNegative, validateNotEmpty];
            for (var i = 0; i < validations.length; i++) {
                try {
                    validations[i](data);
                } catch (e) {
                    if (e instanceof NegativeNumberException) {
                        //re-throw
                        throw e;
                    } else if (e instanceof EmptyInputException) {
                        // tolerate it
                        data = "0";
                    }
                }
            }
        };
        return InputValidator;

        function validateNotNegative(data) {
            if (data < 0)
                throw new NegativeNumberException(data)
		}
		function validateNotEmpty(data) {
			if (data == "" || data.trim() == "")
				throw new EmptyInputException();
		}
        })();
    try {
        InputValidator.validate("-1");
    } catch (e) {
        console.log(e.toString()); // NegativeNumberException:Negative number!Value: -1
        console.log("Validation is done."); // Validation is done.
        var validations = [validateNotNegative, validateNotEmpty];
    }
2カスタムイベント
カスタムイベントは、コードの複雑さを低減し、オブジェクト間の結合を低減することができる.以下は典型的なイベントモードである.
function EventManager() {}
var listeners = {};
EventManager.fireEvent = function (eventName, eventProperties) {
    if (!listeners[eventName])
        return;
    for (var i = 0; i < listeners[eventName].length; i++) {
        listeners[eventName][i](eventProperties);
    }
};
EventManager.addListener = function (eventName, callback) {
    if (!listeners[eventName])
        listeners[eventName] = [];
    listeners[eventName].push(callback);
};
EventManager.removeListener = function (eventName, callback) {
    if (!listeners[eventName])
        return;
    for (var i = 0; i < listeners[eventName].length; i++) {
        if (listeners[eventName][i] == callback) {
            delete listeners[eventName][i];
            return;
        }
    }
};
EventManager.addListener("popupSelected", function (props) {
    console.log("Invoked popupSelected event: "+props.itemID);
});
EventManager.fireEvent("popupSelected", {
    itemID: "100"
}); //
Invoked popSelectedイベント:100