2016-11-20 3 views
1

Gibt es eine Möglichkeit, den Namen der Variablen mit einem Konstruktor erhalten?Erhalten Sie Name des Konstruktors in Javascript

var TestFunction = function() { 
    this.name = ???(); // should return '$testName' 
} 
var $testName = new TestFunction(); 

$testName.name zurückgeben sollte $testName THX

+3

Klingt wie ein X/Y-Problem. Warum glauben Sie, dass die Funktion den Variablennamen so herausfinden soll? Was ist dein * tatsächliches * Endziel? –

+0

Es ist ein Cookie-System, also kannst du test = new Cookie ('value', 10000) sagen, und es wäre nett, wenn test.name test ist – howtoweb

+0

Ich fürchte, du musst es als Argument wiederholen. –

Antwort

6

sollte zurückkehren '$ Testname'

Das bedeutet, Sie fragen, wie eine Funktion, um den Namen einer Variablen sein Ergebnis wissen kann (oder vielmehr, das Ergebnis von new, das es aufruft) wird gerade zugewiesen. Es kann nicht, es keinen Mechanismus dafür ist, nicht zuletzt wegen dieser Möglichkeiten:

a = b = c = d = new TestFunction(); 
// or 
new TestFunction(); 
// or 
foo(new TestFunction()); 

... aber wirklich, weil im Grunde die Funktion nichts zu suchen hat, in der alles über den Kontext zu kennen es andere genannt als was der Programmierer gewählt hat, um es als Argumente zu übergeben.

Wenn Sie also die Funktion wollen, dass die Informationen zu haben, müssen Sie es in passieren, auch wenn das wiederholend:

var $testName = new TestFunction("$testName"); 

Es gibt einen speziellen Fall (Variablen im globalen Bereich) wo Sie vermeiden könnten, den Namen zu wiederholen und nur übergeben Sie es als ein Argument für die Funktion (Verlassen der var $testname = Teil) und dann die Funktion erstellen die "Variable", aber es würde die Funktion an den globalen Geltungsbereich binden, die fallen würde tief in das Gebiet von Bad Idea ™. :-)

So sieht der Spezialfall aus. Wir empfehlen dringend, dies nicht zu tun. (Statt: squint eine excellent suggestion in a comment hatte.)

// STRONGLY RECOMMEND NOT DOING THIS 
function TestFunction(name) { 
    window[name] = this; // Creates a global 
    this.name =name; 
} 

new TestFunction("$testname"); 
console.log($testname); // {name: "$testname"} 

Das funktioniert, weil, wenn Sie eine Immobilie auf dem globalen Objekt zu erstellen (die Sie über window auf Browser zugreifen können), ist es eine globale Variable erstellt.

Bitte tun Sie das nicht. :-)


squint's Proxy idea angeht, wäre es etwa so aussehen:

// Requires ES2016 ("ES6") support in the browser 
 
// Proxy cannot be shimmed, so transpiling won't help 
 
const cookieStore = new Map(); // Our fake storage; you'd use the browser's actual cookie store 
 
function cmAccessor(name, ...args) { 
 
    if (args.length == 0) { 
 
    // Getter; you'd actually use the browser store 
 
    const entry = cookieStore.get(name); 
 
    return entry && entry.value; 
 
    } 
 
    // Setter 
 
    const [value, duration] = args; 
 
    console.log(`Setting '${name}' to '${value}' for ${duration}`); 
 
    // You'd use the real browser store here 
 
    cookieStore.set(name, {value, duration}); 
 
} 
 
const CM = new Proxy(Object.create(null), { 
 
    get(target, name) { 
 
    let result = target[name]; 
 
    if (!result) { 
 
     result = cmAccessor.bind(null, name); 
 
     target[name] = result; 
 
    } 
 
    return result; 
 
    } 
 
}); 
 
CM.cookie1("cookie1 value", 42); 
 
CM.cookie2("cookie2 value", 42); 
 
console.log(CM.cookie1()); 
 
console.log(CM.cookie2());

Aber Sie würden wahrscheinlich besser dran, nur eine Funktion, a'la jQuery :

// This version is ES5 compatible 
 

 
const cookieStore = new Map(); // Our fake storage; you'd use the browser's actual cookie store 
 

 
function CM(name, value, duration) { 
 
    switch (arguments.length) { 
 
    case 0: 
 
     throw new Error("'name' is required"); 
 
    case 1: 
 
     // Getter 
 
     // You'd use the browser's real cookie store here 
 
     const entry = cookieStore.get(name); 
 
     return entry && entry.value; 
 
    default: 
 
     // Setter 
 
     console.log("Setting '" + name + "' to '" + value + "' for " + duration); 
 
     // You'd use the real cookie store here 
 
     cookieStore.set(name, {name: name, value: value}); 
 
    } 
 
} 
 

 
// Usage: 
 
CM("cookie1", "cookie1 value", 42); 
 
CM("cookie2", "cookie2 value", 42); 
 
console.log(CM("cookie1")); 
 
console.log(CM("cookie2"));

Verwandte Themen