通过 `call` 绑定 `this` 不起作用

Binding `this` through `call` not working

我正在尝试将 Express app.set 函数更改为不区分大小写。这样

app.set('PORT',80);
app.set('port'); // => undefined; trying to make it so that it returns 80

在内部它只是一个改变对象 settings 属性 的函数。所以我试着做了一个包装器

var set = app.set;
app.set = function(setting){
    setting = setting.toLowerCase();
    return set.call(app, arguments);
}

但是没用。它根本不会更改 app 的设置 属性。好像抢不过this.

有效的是:

app.set_ = app.set;
app.set = function(setting){
    setting = setting.toLowerCase();
    return app.set_(setting, arguments[1]);
}

因此,只有当 set_ 附加app 时,它才有效。

但我认为 .call 方法和传递 app 应该做基本相同的事情,但事实并非如此。为什么会这样?

对于 arguments,您需要 apply 而不是 call,例如:

set.apply(app, arguments)

或使用 call 和一个参数:

set.call(app, setting)

或者您可以永久绑定 app

var set = app.set.bind(app)

然后正常调用函数:

set(setting)