読者です 読者をやめる 読者になる 読者になる

javascriptでもpythonのdecoratorを使いたい

新人の真崎です。 学生時代は、pythonをいじってたりしたので、今回はpythonの機能からjsで実装できそうなものを作ってみたいと思います。

pythonのdecorator

関数の処理の前後に任意の処理を飾り付けれる機能のことです。いわいるデコレータパターンだと思います。

def deco(opt):
    def wrapper(func):
        def impl(*args, **kwargs):
            print args, kwargs, opt
            print "before"
            r = func(*args, **kwargs)
            print "after"
            return r + opt
        return impl
    return wrapper

@deco(1)
def f(a):
    print a
    return a
f(2)
=> 3

javascriptでの実装

var deco = function() {
    var args = arguments;
    var wrapper = function(fn) {
        var impl = function() {
            console.log("decorator arg", args, "wraper arg", arguments);
            console.log("preprocess");
            var r = fn.apply(this, Array.prototype.slice.call(arguments));
            console.log("postprocess");
            return r + ":" + Array.prototype.join.call(args);
        }
        return impl;
    }
    return wrapper;
};

var f = deco(1)(function() {
        console.log(arguments);
        return Array.prototype.join.call(arguments);
f(2, 3);
=> "2,3:1"

まとめ

javascriptpythonのdecoratorを実装例を示してみました。 デコレータを使うことで、定型的な前処理・後処理をまめることができると思います。