使用javascript的python装饰器
我想做的是: 我有一个提醒某些事情的功能:使用javascript的python装饰器,javascript,decorator,Javascript,Decorator,我想做的是: 我有一个提醒某些事情的功能: myfunction = function(foobar) { alert(foobar); }; 现在我想装饰它,以便: decorate = function(callback) { return function(foobar) { callback(foobar); cons
myfunction = function(foobar) {
alert(foobar);
};
现在我想装饰它,以便:
decorate = function(callback) {
return function(foobar) {
callback(foobar);
console.log(foobar);
};
};
这样我就可以写:
myfunction = decorate(myfunction);
然后myfunction将在控制台中执行普通+日志
如何使其与Javascript一起工作?是的,您可以。事实上,您的实现非常有效:| 我建议使用函数声明而不是函数表达式,不过: 如果您想创建一个更通用的版本,请查看使用
apply
(|)和参数
伪数组(|):|
该版本有两个功能:
函数
此
值)上下文
)回调函数时,保留this
的值…这在装饰对象函数(有时称为方法)时非常方便。更通用的使用参数和应用:
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function() {
callback.apply(null, arguments);
console.log(arguments);
};
}
var result = decorate(myfunction);
result("Hi there");
实际上它确实是这样工作的,我通常使用函数声明,但在这种情况下,函数是在数组中定义的(它用于$.ajax()中的statusCode)。我很高兴看到一个通用版本。@Natim:奇怪的是,我刚刚添加了一个。:-)问题是,有时在回调之前调用包装器,有时在回调之后调用包装器。但是您的实现很有趣。@Natim:您可以让
decoration
函数很容易地接受一个对象,其中的before
和after
键引用要调用的函数(当然,这两个键中的任何一个都是可选的,可能还有beforeContext
和afterContext
).
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function(foobar) {
callback(foobar);
console.log(foobar);
};
}
var result = decorate(myfunction);
result("Hi there");
function decorate(original, wrapper, context) {
return function() {
try {
original.apply(this, arguments);
}
catch (e) {
}
try {
wrapper.apply(context || this, arguments);
}
catch (e) {
}
};
}
function myFunction(arg1, arg2) {
alert("arg1 = " + arg1 + ", arg2 = " + arg2);
}
var newFunction = decorate(myFunction, function(arg1, arg2) {
console.log("arg1 = " + arg1 + ", arg2 = " + arg2);
});
newFunction(1, 2);
function myfunction(foobar) {
alert(foobar);
}
function decorate(callback) {
return function() {
callback.apply(null, arguments);
console.log(arguments);
};
}
var result = decorate(myfunction);
result("Hi there");