通过 `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)
我正在尝试将 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)