Domanda

Per farla breve:. Sono in una situazione in cui mi piacerebbe un getter PHP-style, ma in JavaScript

Il mio JavaScript è in esecuzione in Firefox solo, in modo da Mozilla specifica JS è OK da me.

L'unico modo che riesco a trovare per fare un getter JS richiede specificandone il nome, ma mi piacerebbe definire un getter per tutti possibili nomi. Non sono sicuro se questo è possibile, ma mi piacerebbe molto sapere.

È stato utile?

Soluzione

Proxy può farlo! Sono così felice questo esiste !! Una risposta qui è dato: Esiste un equivalente javascript di __getattr__ di pitone metodo? . Per riformulare con parole mie:

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 per la vittoria! Controlla la documentazione MDN: https: //developer.mozilla .org / it-IT / docs / Web / JavaScript / Reference / Global_Objects / Proxy

Opere in Chrome, Firefox, e node.js. Svantaggi: non funziona in IE - freakin IE. Presto.

Altri suggerimenti

Il più vicino si può trovare è __noSuchMethod__ , che è equivalente di JavaScript del __call di PHP ().

Purtroppo, non c'è nessun equivalente di __get / __ set, che è un peccato, perché con loro abbiamo potuto implementato __noSuchMethod__, ma non vedono ancora un modo per implementare le proprietà (come in C #) con __noSuchMethod __.

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

foo.bar(1, 2);

Se si esegue la codifica in ES6 è possibile combinare proxy e di classe ad avere una bel codice che sembra php :

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

questo si lega al gestore, in modo da poter utilizzare questo invece di destinazione.

Nota. A differenza di PHP, delega gestisce tutte le richieste di proprietà

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

È possibile controllare quali browser supporto proxy http://caniuse.com/#feat=proxy e la classe http://caniuse.com/#feat=es6-class . Nodo 8 supporto sia.

JavaScript 1.5 ha getter / setter zucchero sintattico . E 'spiegato molto bene da John Resig href="http://ejohn.org/blog/javascript-getters-and-setters/" qui

Non è sufficientemente generico per un uso web, ma certamente Firefox loro ha (anche Rhino, se mai desidera utilizzarlo sul lato server).

Se si ha realmente bisogno di un'implementazione che funziona, si potrebbe "barare" la tua strada arround testando il secondo parametro contro undefined, questo significa anche che si potrebbe usare per ottenere il parametro in realtà impostare.

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;
        }
    }
};

Se siete alla ricerca di qualcosa di simile di PHP funzione __get() , non credo Javascript fornisce tale costrutto.

Il meglio che posso pensare di fare è scorrendo membri non funzione dell'oggetto e quindi la creazione di una funzione corrispondente "getXYZ ()" per ciascuna.

Nel codice di pseudo-ish malfamata:

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"
        };
    }
}

Ho finito per usare rispondere a una nickfs' per costruire la mia soluzione. La mia soluzione creerà automaticamente get_ {} propname e set_ funzioni {} propName per tutte le proprietà. Essa verificare che la funzione esiste già prima di aggiungere loro. Questo consente di ignorare il get di default o il metodo impostato con la nostra implementazione senza il rischio di ottenerlo sovrascritto.

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;
                    };
                }
            })();
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top