対象に向けたJS(6)カスタム異常とイベント
3914 ワード
1カスタム異常
JavaScriptにはError、Type Errer、SyntxErrorなどの異常が内蔵されています.これらの異常は運行時に作成されます.各異常は未確認です.普通のオブジェクトは、例外的な文の中で使用できます.したがって、カスタムの異常を作成し、投げたり、捕らえることができます.カスタム異常の優れた手法はJavaScriptの標準的なErrオブジェクトを継承することです.
カスタムイベントは、コードの複雑さを低減し、オブジェクト間の結合を低減することができる.以下は典型的なイベントモードである.
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