我知道此引用了对象所有者。但是我正在努力让课程成功,同时试图找出这个引用的内容。
猜猜最好只显示代码:
function Ajax_Class(params) {
// Public Properties
this.Response = null;
// Private Properties
var RequestObj = null;
// Prototype Methods
this.OnReset = function() { };
this.OnOpenConn = function() { };
this.OnDataSent = function() { };
this.OnLoading = function() { };
this.OnSuccess = function() { alert("default onSuccess method."); };
this.OnFailure = function() { alert("default onFailure method."); };
// Public Methods
this.Close = function() { // Abort current Request
if (RequestObj) {
RequestObj.abort();
RequestObj = null;
return true;
} else return false;
};
// Private Methods
var Instance = function() { // To create instance of Http Request
try { return new XMLHttpRequest(); }
catch (error) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch (error) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch (error) {}
// throw new Error("Could not create HTTP request object.");
return false;
};
var ReadyStateHandler = function() {
// Switch through possible results
switch(RequestObj.readyState) {
case 0:
this.OnReset();
break;
case 1:
this.OnOpenConn();
break;
case 2:
this.OnDataSent();
break;
case 3:
this.OnLoading();
break;
case 4:
// Check Status
if (RequestObj.status == 200) {
// Handle Response
Response = HandleResponse();
// Call On Success
this.OnSuccess();
// Hide Loading Div
LoadingDiv(true);
} else {
this.OnFailure();
}
break;
} // End Switch
};
var Open = function() {
// In case it's XML, Override the Mime Type
if ((params["ResponseType"] == "XML") && (RequestObj.overrideMimeType))
RequestObj.overrideMimeType('text/xml');
//
if ((params["User"]) && (params["Password"]))
RequestObj.open(params["Method"], params["URL"], params["Async"], params["User"], params["Password"]);
else if (params["User"])
RequestObj.open(params["Method"], params["URL"], params["Async"], params["User"]);
else
RequestObj.open(params["Method"], params["URL"], params["Async"]);
// Set Request Header ?
if (params["method"] == "POST")
//this.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
RequestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
};
var Send = function() {
if (params["Data"]) RequestObj.send(params["Data"]);
else RequestObj.send(null);
};
var HandleResponse = function() {
if (params["ResponseType"] == "JSON")
return ParseJSON(RequestObj.responseText);
else if (params["ResponseType"] == "XML")
return RequestObj.responseXML;
else
return RequestObj.responseText;
};
// Method ParseJSON
var ParseJSON = function(obj) {
if (obj)
return JSON.parse(obj);
}; // End ParseJSON
// Method LoadingDiv -> Either Shows or Hides the Loading Div
var LoadingDiv = function(hide) {
// Hide the Modal Window
if (hide) { document.getElementById("Async").style.display = "none"; return false; }
// Show Modal Window
document.getElementById("Async").style.display = "block";
// Reset the Position of the Modal_Content to 0, x and y
document.getElementById("Async_Container").style.left = "0px";
document.getElementById("Async_Container").style.top = "0px";
// Center the Modal Area, no matter what the content
var Screen_Width, Screen_Height;
// Get screen data
if (typeof(window.innerWidth) == "number") { Screen_Width = window.innerWidth; Screen_Height = window.innerHeight; } //Non-IE
else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { //IE 6+ in 'standards compliant mode'
Screen_Width = document.documentElement.clientWidth;
Screen_Height = document.documentElement.clientHeight;
} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { //IE 4 compatible
Screen_Width = document.body.clientWidth;
Screen_Height = document.body.clientHeight;
}
// Set Modal_Content Max Height to allow overflow
document.getElementById("Async_Container").style.maxHeight = Screen_Height - 200 + "px";
// Get Modal_Container data
var El_Width = document.getElementById("Async_Container").offsetWidth;
var El_Height = document.getElementById("Async_Container").offsetHeight;
// Set the Position of the Modal_Content
document.getElementById("Async_Container").style.left = ((Screen_Width/2) - (El_Width/2)) + "px";
document.getElementById("Async_Container").style.top = ((Screen_Height/2) - (El_Height/2)) + "px";
};
// Constructor
// Check the Params
// Required Params
if (!params["URL"]) return false;
// Default Params
params["Method"] = (!params["Method"]) ? "GET" : params["Method"]; // GET, POST, PUT, PROPFIND
params["Async"] = (params["Async"] === false) ? false : true;
params["ResponseType"] = (!params["ResponseType"]) ? "JSON" : params["ResponseType"]; // JSON, TXT, XML
params["Loading"] = (params["Loading"] === false) ? false : true;
// Optional Params
// params["User"])
// params["Password"]
// Create Instance of Http Request Object
RequestObj = Instance();
// Handle Ajax according to Async
if (params["Async"]) {
// Handle what should be done in case readyState changes
if (params["Loading"]) LoadingDiv();
// State Handler || Response is Handled within the code
RequestObj.onreadystatechange = ReadyStateHandler;
// Open & Send
Open();
Send();
} else {
// Handle the Loading Div
if (params["Loading"]) LoadingDiv();
// Open & Send
Open();
Send();
// Handle Response
this.Response = HandleResponse();
// No State Handler, Application has been waiting for modifications.
//this.OnSuccess(Response);
// Handle the Loading Div
LoadingDiv(true);
}
// no problems?
return true;
} // End Ajax
然后,在页面内:
window.onload = function() {
update_states = function() {
this.OnSuccess = function() {
alert("overriden onSuccess Method");
};
};
update_states.prototype = new Ajax_Class({URL:"ajax/states.php?id=5&seed="+Math.random()});
run_update_states = new update_states;
} // Window Onload
我要做的是拥有一个Default OnSuccess(等等)方法,并且,如果需要,我可以使用子类方法覆盖默认方法,但仍然会在HttpRequest状态时自动调用它变化
如果有人能指出我正确的方向,我会很感激,如果我能理解为什么这个在这个环境中不起作用以及如何让它参考正确的对象。
感谢您的帮助。
答案 0 :(得分:1)
this
根据调用内容的方式设置。这些是设置的不同方式:
func()
- 正常的函数调用。 this
设置为全局对象(浏览器中为window
)。
obj.method()
- 方法调用。 this
设置为obj
。
func.call(obj, arg1, arg2, ...)
- 使用.call()
。 this
设置为obj
。
func.apply(obj, args)
- 使用.apply()
。 this
设置为obj
。
func.bind(obj, arg1, arg2, ...)
- 使用.bind()
。创建一个新函数,在调用时将this
设置为obj
(在内部,它在其实现中使用.apply()
。
需要注意的典型事项。
this
指针在该函数内为window
。this
值。您可能必须将原始this
值保存到局部变量中(通常称为self
按惯例)所以你可以从你的回调函数中引用它。答案 1 :(得分:1)
也许你正在尝试做类似的事情:
function Base() {}
Base.prototype.showName = function() {
alert('Base method: ' + this.name);
}
function Foo(name, arg){
this.name = name;
// Extend this if arg is an object
if (typeof arg == 'object') {
for (var p in arg) {
// This references the new instance if called with new keyword
if (arg.hasOwnProperty(p)) {
this[p] = arg[p];
}
}
}
}
Foo.prototype = new Base();
// Re-assign constructor property (not very useful but some to do like this)
Foo.prototype.constructor = Foo;
var inst0 = new Foo('foo 0');
// Override inherited method
var inst1 = new Foo(
'foo 1',
{showName: function(){alert('Instance method: ' + this.name);}}
);
inst0.showName(); // Base method: foo 0
inst1.showName(); // Instance method: foo 1
但是还有其他(更简单?更好?)的方法。让原型继承和javascript的动态自然为你工作,不要试图让它模仿其他继承模式只是因为你对它们更熟悉。
答案 2 :(得分:0)
run_update_states = new update_states();
注意括号。