組み込みのErrorを拡張したErrorオブジェクトを実装する。

本コンテンツの一部は、業務時間内に調べた内容を含んでおり、株式会社ディー・エヌ・エーの提供でお送りしております。

構成

/
|- MyError.js
`- MyError_spec.js

MyError.js

/**
 * @class
 * @constructor
 */
function MyError(message) {
    Error.call(this, message);
    if (message !== undefined) {
        this.message = String(message);
    }
};

MyError.prototype = (function(base) {
    var Inheritor = function(){};
    Inheritor.prototype = base.prototype;
    return new Inheritor();
})(Error);

MyError.prototype.constructor = MyError;
MyError.prototype.name = "MyError";
MyError.prototype.message = "";
MyError.prototype.toString = function() {
    return "[object " + this.name + "]";
};

exports.MyError = MyError;

上記実装だと、instanceofでErrorとMyErrorがそれぞれtrueになる。

MyError_spec.js

jasmine-nodeのspecファイルは下記の通り。

var MyError = require("./MyError").MyError;

describe("MyError packages called new", function() {
    var e;
    beforeEach(function() {
        e = new MyError("throw new MyError");
    });

    it("type of", function() {
        type = typeof e;
        expect(type).toEqual("object");
    });

    it("instance of MyError", function() {
        expect(e instanceof MyError).toEqual(true);
    });

    it("instance of Error", function() {
        expect(e instanceof Error).toEqual(true);
    });

    it("throw new MyError", function() {
        try {
            throw e;
        } catch (e) {
            var name = e.name;
            var message = e.message;
            expect(name).toEqual("MyError");
            expect(message).toEqual("throw new MyError");
        }
    });

    it("toString method", function() {
        var str = e.toString();
        expect(str).toEqual("[object MyError]");
    });
});

追記

特になし。