Frage

Lange Rede kurzer Sinn:. Ich in einer Situation bin, wo ich einen PHP-Stil Getter möchte, aber in JavaScript

Ihr JavaScript ist nur in Firefox ausgeführt wird, so Mozilla spezifische JS ist OK von mir.

Die einzige Möglichkeit, die ich finden kann ein JS Getter erfordert die Angabe seines Namens zu machen, aber ich möchte einen Getter für alle möglichen Namen definieren. Ich bin mir nicht sicher, ob dies möglich ist, aber ich würde sehr gerne wissen.

War es hilfreich?

Lösung

Proxy kann es tun! Ich bin so glücklich, diese existiert !! Eine Antwort ist hier gegeben: Gibt es eine JavaScript-Äquivalent von Python __getattr__ Methode? . Umformulieren in meinen eigenen Worten:

var x = new Proxy({},{get(target,name) {
  return "Its hilarious you think I have "+name
}})

console.log(x.hair) // logs: "Its hilarious you think I have hair"

Proxy für den Gewinn! Schauen Sie sich die MDN-Dokumentation: https: //developer.mozilla .org / en-US / docs / Web / JavaScript / Reference / Global_Objects / Proxy

Werke in Chrome, Firefox und node.js. Nachteil dieser Methode: funktioniert nicht in IE - freakin IE. Bald.

Andere Tipps

Die nächstgelegene Sie finden können, ist __noSuchMethod__ , das ist JavaScript Äquivalent von PHP __call ().

Leider gibt es kein Äquivalent __get / __ gesetzt, was eine Schande ist, weil mit ihnen wir __noSuchMethod__ umgesetzt haben könnte, aber ich sehe noch nicht einen Weg Eigenschaften zu implementieren (wie in C #) mit __noSuchMethod __.

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);

Wenn Sie in ES6 kodieren Sie Proxy und Klasse kombinieren können einen gut aussehenden Code wie PHP haben :

class Magic {
    constructor () {
        return new Proxy(this, this);
    }
    get (target, prop) {
        return this[prop] || 'MAGIC';
    }
}

Dieses bindet an den Handler, so können Sie dies anstelle von Ziel verwenden.

. Hinweis: im Gegensatz zu PHP, Proxy behandelt alle eine Immobilie

let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC

Sie können prüfen, welche Unterstützung Proxy http://caniuse.com/#feat=proxy und Klasse http://caniuse.com/#feat=es6-class . Knoten 8 Unterstützung beide.

Javascript 1.5 hat Getter / Setter syntaktischer Zucker . Es ist sehr gut erklärt von John Resig hier

Es ist nicht allgemein genug für Web-Nutzung, aber sicherlich Firefox hat sie (auch Rhino, wenn Sie es jemals auf der Server-Seite verwenden möchten).

Wenn Sie wirklich eine Implementierung benötigen, die funktioniert, könnten Sie „betrügen“ Weg arround durch den zweiten Parameter gegen undefined Testen bedeutet dies auch, könnte man tatsächlich den Parameter erhalten verwenden.

var foo = {
    args: {},

    __noSuchMethod__ : function(id, args) {
        if(args === undefined) {
            return this.args[id] === undefined ? this[id] : this.args[id]
        }

        if(this[id] === undefined) {
            this.args[id] = args;
        } else {
            this[id] = args;
        }
    }
};

Wenn Sie sich für so etwas wie PHP __get() Funktion, ich glaube nicht, Javascript bietet eine solche Konstruktion.

Das Beste, was ich tun denken kann, wird Schleife durch die Nicht-Funktionselemente des Objekts und dann eine entsprechende „getXYZ ()“ Funktion für jeden zu schaffen.

In zwielichtigen pseudo-ish Code:

for (o in this) {
    if (this.hasOwnProperty(o)) {
        this['get_' + o] = function() {
            // return this.o -- but you'll need to create a closure to
            // keep the correct reference to "o"
        };
    }
}

ich am Ende mit einem nickfs' Antwort meiner eigene Lösung zu konstruieren. Meine Lösung erstellt automatisch get_ {propname} und {set_ propname} Funktionen für alle Eigenschaften. Es muss prüfen, ob die Funktion existiert bereits, bevor sie hinzufügen. Auf diese Weise können Sie die Standard-get oder set-Methode mit eigenen Implementierung ohne das Risiko, es überschrieben immer außer Kraft zu setzen.

for (o in this) {
        if (this.hasOwnProperty(o)) {
            var creategetter = (typeof this['get_' + o] !== 'function');
            var createsetter = (typeof this['set_' + o] !== 'function');
            (function () {
                var propname = o;
                if (creategetter) {
                    self['get_' + propname] = function () {
                        return self[propname];
                    };
                }
                if (createsetter) {
                    self['set_' + propname] = function (val) {
                        self[propname] = val;
                    };
                }
            })();
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top