我是否有任何设计模式可以在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
现在是真/假)还有更多的字符。
答案 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相同的装饰器模式。我已经创建了一个模块,可以让您轻松地使用自己的代码包装原始代码。