addProperty (Object.addProperty-Methode)

public addProperty(name:String, getter:Function, setter:Function) : Boolean

Erstellt eine Get-/Set-Eigenschaft. Wenn Flash eine Get-/Set-Eigenschaft liest, wird die get-Funktion aufgerufen, und name wird der Rückgabewert der Funktion zugewiesen. Wenn Flash eine Get-/Set-Eigenschaft schreibt, wird die set-Funktion aufgerufen und der neue Wert als Parameter übergeben. Wenn bereits eine Eigenschaft mit dem angegebenen Namen vorhanden ist, wird sie durch die neue Eigenschaft überschrieben.

Eine Get-Funktion ist eine Funktion ohne Parameter. Ihr Rückgabewert kann einem beliebigen Datentyp angehören. Der Datentyp kann sich zwischen zwei Aufrufen ändern. Der Rückgabewert wird als aktueller Wert der Eigenschaft behandelt.

Eine Set-Funktion ist eine Funktion, die genau einen Parameter (den neuen Wert der Eigenschaft) akzeptiert. Wenn beispielsweise die Eigenschaft x durch die Anweisung x = 1 zugewiesen wird, wird der Set-Funktion der Parameter 1 (Datentyp Number) übergeben. Der Rückgabewert der Set-Funktion wird ignoriert.

Sie können Get-/Set-Eigenschaften zu Prototypobjekten hinzufügen. Wenn Sie eine Get-/Set-Eigenschaft zu einem Prototypobjekt hinzufügen, geht die Get-/Set-Eigenschaft auf alle Objektinstanzen über, die das Prototypobjekt erben. Eine Get-/Set-Eigenschaft kann daher an einer Stelle hinzugefügt werden (im Prototypobjekt) und wird dann für alle Instanzen einer Klasse übernommen, ähnlich wie Methoden, die Prototypobjekten hinzugefügt werden. Wenn eine Get-/Set-Funktion für eine Get-/Set-Eigenschaft in einem geerbten Prototypobjekt aufgerufen wird, wird der Get-/Set-Funktion als Referenz das ursprünglich referenzierte Objekt und nicht das Prototypobjekt übergeben.

Wenn Object.addProperty() falsch aufgerufen wird, kann ein Fehler bei der Ausführung auftreten. Die möglichen Fehlerbedingungen sind in der folgenden Tabelle aufgeführt:

Fehlerbedingung

Konsequenz

name ist kein gültiger Eigenschaftsname, z. B. ein leerer String.

Es wird false zurückgegeben, und die Eigenschaft wird nicht hinzugefügt.

getter ist kein gültiges Funktionsobjekt.

Es wird false zurückgegeben, und die Eigenschaft wird nicht hinzugefügt.

setter ist kein gültiges Funktionsobjekt.

Es wird false zurückgegeben, und die Eigenschaft wird nicht hinzugefügt.

Verfügbarkeit: ActionScript 1.0, Flash Lite 2.0. Bei ActionScript 2.0-Klassen können Sie anstelle dieser Methode get oder set verwenden.

Parameter

name:String - Ein String. Der Name der zu erstellenden Objekteigenschaft.

getter:Function - Die Funktion, die aufgerufen wird, um den Wert der Eigenschaft abzurufen. Dieser Parameter ist ein Funktionsobjekt.

setter:Function - Die Funktion, die aufgerufen wird, um den Wert der Eigenschaft festzulegen. Dieser Parameter ist ein Funktionsobjekt. Wenn Sie für diesen Parameter den Wert null übergeben, ist die Eigenschaft schreibgeschützt.

Rückgabewerte

Boolean - Ein boolescher Wert: true, wenn die Eigenschaft erfolgreich erstellt wurde, andernfalls false.

Beispiel

Im folgenden Beispiel verfügt ein Objekt über zwei interne Methoden: setQuantity() und getQuantity(). Durch Setzen oder Abfragen der Eigenschaft bookcount werden diese beiden Methoden aufgerufen. Eine dritte interne Methode, getTitle(), gibt einen schreibgeschützten Wert zurück, der mit der Eigenschaft bookname verknüpft ist. Wenn ein Skript den Wert von myBook.bookcount abruft, ruft der ActionScript-Interpreter automatisch myBook.getQuantity() auf. Wenn ein Skript den Wert von myBook.bookcount ändert, ruft der Interpreter myObject.setQuantity() auf. Da die Eigenschaft bookname keine set-Funktion angibt, werden alle Versuche ignoriert, bookname auf diese Weise zu ändern.

function Book() {
    this.setQuantity = function(numBooks:Number):Void {
    this.books = numBooks;
    };
    this.getQuantity = function():Number {
    return this.books;
    };
    this.getTitle = function():String {
    return "Catcher in the Rye";
    };
    this.addProperty("bookcount", this.getQuantity, this.setQuantity);
    this.addProperty("bookname", this.getTitle, null);
}
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
// Ausgabe: You ordered 5 copies of Catcher in the Rye

Das vorangehende Beispiel funktioniert zwar, die Eigenschaften bookcount und bookname werden jedoch jeder Instanz des Book-Objekts hinzugefügt. Hierzu müssen zwei Eigenschaften für jede Instanz des Objekts vorhanden sein. Wenn in einer Klasse zahlreiche Eigenschaften wie bookcount und bookname vorkommen, wird unter Umständen sehr viel Arbeitsspeicher belegt. Stattdessen können Sie die Eigenschaften Book.prototype hinzufügen, sodass die Eigenschaften bookcount und bookname nur an einer Stelle vorhanden sind. Die Auswirkungen sind jedoch die gleichen wie beim Beispielcode, mit dem bookcount und bookname jeder Instanz direkt hinzugefügt wurden. Beim Versuch, auf eine der Eigenschaften in einer Book-Instanz zuzugreifen, führt das Nichtvorhandensein der Eigenschaft dazu, dass die Prototypkette nach oben hin durchlaufen wird, bis die in Book.prototype definierten Versionen gefunden werden. Das folgende Beispiel verdeutlicht, wie Book.prototype Eigenschaften hinzugefügt werden können:

function Book() {}
Book.prototype.setQuantity = function(numBooks:Number):Void {
    this.books = numBooks;
};
Book.prototype.getQuantity = function():Number {
    return this.books;
};
Book.prototype.getTitle = function():String {
    return "Catcher in the Rye";
};
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity);
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);

Das folgende Beispiel veranschaulicht, wie die impliziten Get- und Set-Funktionen von ActionScript 2.0 verwendet werden. Anstatt die Funktion Book zu definieren und Book.prototype zu bearbeiten, definieren Sie die Klasse Book in einer externen Datei mit dem Namen Book.as. Der folgende Code muss sich in einer separaten externen Datei mit dem Namen Book.as befinden, die nur diese Klassendefinition enthält und im Klassenpfad der Flash-Anwendung gespeichert ist:

class Book {
    var books:Number;
    function set bookcount(numBooks:Number):Void {
    this.books = numBooks;
    }
    function get bookcount():Number {
    return this.books;
    }
    function get bookname():String {
    return "Catcher in the Rye";
    }
}

Der folgende Code kann dann in eine FLA-Datei eingefügt werden. Er funktioniert genauso wie in den vorherigen Beispielen:

var myBook:Book = new Book(); 
myBook.bookcount = 5; 
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);

Siehe auch

get-Anweisung, set-Anweisung