Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript的python装饰器_Javascript_Decorator - Fatal编程技术网

使用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");