【问题标题】:Javascript function decorator design patternJavascript函数装饰器设计模式
【发布时间】:2014-08-15 00:05:51
【问题描述】:

是否有任何设计模式可以在 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 + '.');
}

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

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

我怎样才能做任何 decorator-like 是 Js? 我想到了binding在其创建中的功能

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

但是这样你会丢失实例(this 现在是真/假)以及更多字符。

【问题讨论】:

    标签: javascript design-patterns decorator


    【解决方案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 + '.');
    });
    

    【讨论】:

    • 如果你可以称之为“设计模式”,我不知道。这只是一个AOP 模式,并且凭借 JavaScript 的函数特性,组合函数(在这种情况下使用闭包)是微不足道的 :-)
    【解决方案2】:

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

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

    【讨论】:

    • 是的,转译 ES7 装饰器是要走的路。
    猜你喜欢
    • 2014-02-20
    • 2010-10-05
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多