我在子模块模式代码中工作。想要创建具有对象文字的子模块,问题是this
对于子模块内的对象是MODULE而不是我的对象文字。有什么想法吗?
var MODULE.sub = (function () {
var myObject = {
key: value,
method: function () {
this.key // this = MODULE and not MyObject... :(
}
};
return myObject.method;
}(MODULE));
答案 0 :(得分:0)
这对我有用:
var MODULE = MODULE || {};
MODULE.sub = (function () {
return {
myObject : {
key : 10,
method : function() {
console.log(this.key);
}
}
};
})();
然后叫它:
MODULE.sub.myObject.method();
您只返回方法而不是键,因此“this”将是未定义的。如果您想这样,可以将其保密,并将密钥作为var:
传递 var MODULE = MODULE || {};
MODULE.sub = (function () {
var key = 10,
return {
myObject : {
method : function() {
console.log(key);
}
}
};
})();
答案 1 :(得分:0)
解决了......只需在MODULE.sub中返回一个调用public方法的函数。我不知道是否是最好的方法
var MODULE.sub = (function () {
var myObject = {
key: value,
method: function () {
this.key // this = myObject :)
}
};
return function () {
myObject.method();
}
}(MODULE));
答案 2 :(得分:0)
this
keyword的值取决于函数的调用方式。因此,如果您将该功能分配给MODULE.sub
,然后将其作为MODULE.sub(…)
调用,那么this
当然会指向MODULE
。如果您将其作为myObject.method(…)
调用,则this
将指向该对象。
所以你要么暴露整个myObject
(比如@BingeBoys的回答),要么不导出那个函数,并期望它是myObject
的方法。相反,您可以使用bound一个:
return myObject.method.bind(myObject);
或明确相当于
return function() {
return myObject.method();
};
或者您根本不会将该函数作为method
放在该对象上:
…
var myObject = {
key: value,
};
return function() {
myObject.key // no `this` here
…
};
…