我有一个像这样的资源对象:
var resource = {
...
All sorts of nifty stuff;
...
};
我想动态创建一个函数表达式,并使用关键字this
引用我的资源对象中的其他函数:
resource.url = function(){
return this.constructbaseUrlParams() +
this.constructReqeustParams();
}();
但是this
在这里引用window
对象。
我知道我可以使用:
resource.url = function(){
return resource.constructbaseUrlParams() +
resource.constructReqeustParams();
}();
但我想使用this
,因此该函数可以更加模块化,并且可能允许我在将来创建多个资源对象而不会出现问题。
答案 0 :(得分:2)
使用call
为this
内部指定值:
resource.url = function(){ ... }.call(resource);
或使用bind
。
var fn = function() { ... }.bind(resource);
resource.url = fn();
答案 1 :(得分:2)
this
的值取决于function
的调用方式。
并且,没有使用任何关联的上下文对象调用IIFE。它只是默认为全局对象window
。
您可以使用.call()
指定IIFE的上下文:
resource.url = function () {
console.log(resource === this); // true
return this.constructbaseUrlParams() +
this.constructReqeustParams();
}.call(resource);
答案 2 :(得分:1)
您可以在对象上创建一个新的url
函数,而不是直接调用它:
var resource = {
foo: function() {
console.log('foo');
}
};
resource.url = function() {
this.foo();
}
resource.url(); //foo
此外,如果您想轻松创建具有不同url
函数的资源的新实例,则可以在函数中移动资源对象:
function Resource() {
return {
foo: function() {
console.log('foo');
}
}
}
var r1 = new Resource();
var r2 = new Resource();
r1.url = function() {
this.foo();
}
r1.url(); //foo
r2.url(); //undefined
答案 3 :(得分:0)
资源可以变成一个类。
function Resource() {
this.constructbaseUrlParams = function() {
return "test";
};
this.constructReqeustParams = function() {
return "test2";
};
this.url = function() {
return this.constructbaseUrlParams() +
this.constructReqeustParams();
}
};
var resource = new Resource();
console.log(resource.url());