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"));
Klingt wie ein X/Y-Problem. Warum glauben Sie, dass die Funktion den Variablennamen so herausfinden soll? Was ist dein * tatsächliches * Endziel? –
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
Ich fürchte, du musst es als Argument wiederholen. –