Javascript函数装饰设计模式

时间:2014-08-15 00:05:52

标签: javascript design-patterns decorator

我是否有任何设计模式可以在Javascript中实现装饰器?

我们说我有一个user对象,其中is_authenticated属性。

var user = {
    is_authenticated: true,
    name: 'Peter Parker'
}

在Python中,我会创建一个装饰器来返回属性is_authenticated,并且只有在装饰器真正返回时才运行函数命令,如下所示:

function userIsAuthenticated() {
    return user.is_authenticated;
}

@userIsAuthenticated
function say(message) {
    console.log(message + '\nSays ' user.name + '.');
}

Javascript我必须在运行函数内部之前检查用户是否经过身份验证。

function say(message) {
    if (user.is_authenticated) {
        console.log(message + '\nSays ' user.name + '.');
    }
}

我怎样才能做任何装饰器是Js? 我在创建中考虑了binding函数

function say(message) {
    this && (function(){
        console.log(message + '\nSays ' user.name + '.');
    }());
}.bind(user.is_authenticated);

但是这样你就失去了实例(this现在是真/假)还有更多的字符。

2 个答案:

答案 0 :(得分:1)

只需将其包裹起来,让is_authentificated返回一个新函数:

function userIsAuthenticated(fn) {
    return function() {
        if (user.is_authenticated)
            return fn.apply(this, arguments);
    };
}

你可以用它来装饰任意函数:

var say = userIsAuthenticated(function say(message) {
    console.log(message + '\nSays ' + user.name + '.');
});

答案 1 :(得分:1)

在ES2016中你可以使用与python相同的装饰器模式。我已经创建了一个模块,可以让您轻松地使用自己的代码包装原始代码。

https://github.com/cmartin81/decorator-wrap