__resolve (Object.__resolve-Eigenschaft)

public __resolve : Object

Eine Referenz auf eine benutzerdefinierte Funktion, die aufgerufen wird, wenn ActionScript-Code auf eine undefinierte Eigenschaft oder Methode verweist. Wenn ActionScript-Code auf eine undefinierte Eigenschaft oder Methode eines Objekts verweist, ermittelt Flash Player, ob die __resolve-Eigenschaft des Objekts definiert ist. Wenn __resolve definiert ist, wird die Funktion, auf die diese Eigenschaft verweist, ausgeführt und der Name der undefinierten Eigenschaft oder Methode übergeben. Somit können Sie Werte für undefinierte Eigenschaften und Anweisungen für undefinierte Methoden programmgesteuert bereitstellen und den Eindruck erwecken, als seien diese Eigenschaften und Methoden definiert. Diese Eigenschaft ist nützlich, um eine extrem transparente Client-/Serverkommunikation zu ermöglichen, und wird zum Aufrufen von Methoden auf Serverseite empfohlen.

Verfügbarkeit: ActionScript 1.0, Flash Lite 2.0

Beispiel

Die folgenden Beispiele bauen progressiv auf dem ersten Beispiel auf und veranschaulichen fünf verschiedene Verwendungen der Eigenschaft __resolve. Zum besseren Verständnis sind wichtige Anweisungen, die sich von der vorausgehenden Verwendung unterscheiden, fett hervorgehoben.

Verwendung 1: Im folgenden Beispiel wird mit __resolve ein Objekt erstellt, bei dem jede undefinierte Eigenschaft den Wert "Hello, world!" zurückgibt.

// neues Objekt instanziieren
var myObject:Object = new Object();

// __resolve-Funktion definieren
myObject.__resolve = function (name) {
    return "Hello, world!";
};
trace (myObject.property1); // Ausgabe: Hello, world!
trace (myObject.property2); // Ausgabe: Hello, world!

Verwendung 2: Im folgenden Beispiel wird __resolve als Funktor verwendet, d. h. als Funktion, die andere Funktionen generiert. Mit __resolve werden undefinierte Methodenaufrufe in eine generische Funktion mit dem Namen myFunction umgeleitet.

// neues Objekt instanziieren
var myObject:Object = new Object();

// in __resolve aufzurufende Funktion definieren
myObject.myFunction = function (name) {
    trace("Method " + name + " was called");
};

// __resolve-Funktion definieren
myObject.__resolve = function (name) {
     return function () { this.myFunction(name); };
};

// __resolve mit undefinierten Methodennamen testen
myObject.someMethod(); // Ausgabe: Method someMethod was called
myObject.someOtherMethod(); // Ausgabe: Method someOtherMethod was called

Verwendung 3: Das folgende Beispiel baut auf dem vorhergehenden Beispiel auf. Hinzugefügt wird die Fähigkeit, aufgelöste Methoden zwischenzuspeichern. Durch das Zwischenspeichern von Methoden wird __resolve für jede in Frage kommende Methode nur einmal aufgerufen. Dadurch ist eine Lazy Construction von Objektmethoden möglich. "Lazy Construction" ist eine Optimierungstechnik, mit der die Erstellung - oder Konstruktion - von Methoden bis zu dem Zeitpunkt hinausgezögert wird, zu dem die Methode zum ersten Mal verwendet wird.

// neues Objekt instanziieren
var myObject:Object = new Object();
// in __resolve aufzurufende Funktion definieren
myObject.myFunction = function(name) {
    trace("Method "+name+" was called");
};
// __resolve-Funktion definieren
myObject.__resolve = function(name) {
    trace("Resolve called for "+name); // um zu prüfen, zu welchem Zeitpunkt __resolve aufgerufen wird
    // nicht nur die Funktion aufrufen, sondern auch eine entsprechende Referenz speichern
    var f:Function = function () {
        this.myFunction(name);
    };
    // neue Objektmethode erstellen und der Referenz zuweisen
    this[name] = f;
    // Referenz zurückgeben
    return f;
};
// __resolve mit undefinierten Methodennamen testen
// __resolve wird für jeden Methodennamen nur einmal aufgerufen
myObject.someMethod(); // __resolve wird aufgerufen
myObject.someMethod(); // __resolve wird nicht aufgerufen, da die Methode jetzt definiert ist
myObject.someOtherMethod(); // __resolve wird aufgerufen
myObject.someOtherMethod(); // __resolve wird nicht aufgerufen, da die Methode jetzt definiert ist

Verwendung 4: Das folgende Beispiel baut auf dem vorhergehenden Beispiel auf. Der Methodenname onStatus() wird für die lokale Verwendung reserviert, sodass er nicht in derselben Weise aufgelöst wird wie andere undefinierte Eigenschaften. Hinzugefügter Code ist fett hervorgehoben.

// neues Objekt instanziieren
var myObject:Object = new Object();
// in __resolve aufzurufende Funktion definieren
myObject.myFunction = function(name) {
    trace("Method "+name+" was called");
};
// __resolve-Funktion definieren
myObject.__resolve = function(name) {
    // Namen "onStatus" zur lokalen Verwendung reservieren
    if (name == "onStatus") {
        return undefined;
    }
    trace("Resolve called for "+name); // um zu prüfen, zu welchem Zeitpunkt __resolve aufgerufen wird
    // nicht nur die Funktion aufrufen, sondern auch eine entsprechende Referenz speichern
    var f:Function = function () {
        this.myFunction(name);
    };
    // neue Objektmethode erstellen und der Referenz zuweisen
    this[name] = f;
    // Referenz zurückgeben
    return f;
};
// __resolve mit dem Methodennamen "onStatus" testen
trace(myObject.onStatus("hello"));
// Ausgabe: undefined

Verwendung 5: Das folgende Beispiel baut auf dem vorhergehenden Beispiel auf. Es wird ein Funktor erstellt, der Parameter annimmt. Bei diesem Beispiel wird in großem Umfang das arguments-Objekt eingesetzt, und es werden verschiedene Methoden der Klasse Array verwendet.

// neues Objekt instanziieren
var myObject:Object = new Object();

// in __resolve aufzurufende generische Funktion definieren
myObject.myFunction = function (name) {
    arguments.shift();
    trace("Method " + name + " was called with arguments: " + arguments.join(','));
};

// __resolve-Funktion definieren
myObject.__resolve = function (name) {
    // Namen "onStatus" zur lokalen Verwendung reservieren
    if (name == "onStatus") {
        return undefined;
    }
    var f:Function = function () { 
        arguments.unshift(name);
        this.myFunction.apply(this, arguments); 
    };
    // neue Objektmethode erstellen und der Referenz zuweisen
    this[name] = f;
    // Referenz auf die Funktion zurückgeben
    return f;
};

// __resolve mit undefinierten Methodennamen und Parametern testen
myObject.someMethod("hello");
// Ausgabe: Method someMethod was called with arguments: hello

myObject.someOtherMethod("hello","world");
// Ausgabe: Method someOtherMethod was called with arguments: hello,world

Siehe auch

arguments, Array