我正在尝试按如下方式创建JavaScript对象。
var MyObject = function (parameters) {
this.parameters = parameters;
parameters.userFunction(this.MyObjectCallback);
}
MyObject.SOME_STATIC_VARIABLE = 21;
MyObject.prototype = {
myObjectCallback: function() {
console.log(this);
}
}
MyObject
对象将接受将传递处理程序的userFunction。用户函数将执行一些逻辑并将结果传递回实例,例如:
new MyObject({userFunction: function(callback) {
$.post(
'http://localhost/~knyttl/source.php',
{},
callback,
'json');,
}});
不幸的是,即使callback
被正确调用,this
也会获得JQuery
对象的实例,而不是我想要的MyObject
实例的实例。总而言之,我无法保留MyObject
实例。
我甚至不确定,这是否是创建JavaScript对象的正确方法。我将不胜感激任何建议。
答案 0 :(得分:5)
您可以使用this
绑定特定的.bind
值。我还纠正了My
的大写。
parameters.userFunction(this.myObjectCallback.bind(this));
当您调用类似a.b()
的函数时,请调用b
,this === a
。但是,如果您不直接调用它但只传递函数(如a.b
)并稍后调用它,则此绑定将丢失。
.bind
返回一个新函数,现在接收jQuery ajax结果为this
。但是,它会忽略它并使用预定义(绑定)myObjectCallback
调用this
。
.bind
在旧版浏览器上不可用,但有可用垫片。
答案 1 :(得分:0)
parameters.userFunction.call(this, this.MyObjectCallback);
答案 2 :(得分:0)
jQuery允许您设置回调的context。
你处于一种奇怪的境地,你的设计伤害了你。您的MyObject不能作为上下文传入,因为它是在同一时间创建的。
new MyObject({userFunction: function(callback) {
$.post(
'http://localhost/~knyttl/source.php',
{},
callback,
'json');,
}});
所以相反:
var myObj = new MyObejct();
myObj.setCallback({userFunction: function (callback) {
$.ajax({
context: myObj,
url: 'http://localhost/what ever /',
success: callback,
dataType: 'json',
data: {}
}
});
答案 3 :(得分:0)
试试这个。
var myObject = {
obj1:function(paremeters){
this.Name = paremeters
return this},
};
答案 4 :(得分:0)
在javascript中使用此可能会非常混乱。当调用函数时,它被赋予点后面的任何值。
window.doSomething();
会将此设置为窗口,而
myDOMElement.onClick();
会将此设置为myDOMElement。
在您的情况下,它归结为JQuery的内部工作原理,因此请查看this very thorough set of explanations以了解JQuery如何处理此。