0

これがオブジェクトの所有者を参照していることを私は知っています。しかし、これが何を参照しているのかを特定しようとしている間、私はクラスを機能させるのに苦労しています。

コードを表示するのが最善だと思います。

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

私がやろうとしているのは、デフォルトのOnSuccess(など)メソッドです。必要に応じて、デフォルトのメソッドをサブクラスメソッドでオーバーライドできますが、HttpRequestの状態が変更されると自動的に呼び出されます。

誰かが私を正しい方向に向けてくれれば幸いです。なぜこれがこの状況で機能しないのか、そして正しいオブジェクトを参照する方法を理解できれば驚かれることでしょう。

助けてくれてありがとう。

4

3 に答える 3

1

this何かがどのように呼ばれるかに従って設定されます。設定方法は次のとおりです。

  1. func()-通常の関数呼び出し。 (ブラウザ内の)thisグローバルオブジェクトに設定されます。window

  2. obj.method()-メソッド呼び出し。 thisに設定されobjます。

  3. func.call(obj, arg1, arg2, ...)-を使用し.call()ます。 thisに設定されobjます。

  4. func.apply(obj, args)-を使用し.apply()ます。 thisに設定されobjます。

  5. func.bind(obj, arg1, arg2, ...)-を使用し.bind()ます。this呼び出されたときにに設定される新しい関数を作成しますobj(内部的には.apply()、その実装で使用されます)。

注意すべき典型的なこと。

  • オブジェクトのメソッド内からでも通常の関数を呼び出すと、thisポインターはwindowその関数内にあります。
  • コールバック関数は通常、this埋め込まれているコードとは異なる値を受け取ります。コールバック関数から参照できるように、元のthis値をローカル変数(多くの場合self、慣例により呼び出されます)に保存する必要がある場合があります。
于 2012-09-06T22:50:49.367 に答える
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の動的な性質をうまく機能させてください。他の継承パターンに慣れているという理由だけで、他の継承パターンをエミュレートしようとしないでください。

于 2012-09-07T00:04:30.417 に答える
0

これを試しましたか

run_update_states = new update_states();

括弧に注意してください。

于 2012-09-06T22:55:06.473 に答える