Ist das möglich und wenn ja wie? (Ich habe keinen Weg gefunden, wie es funktioniert)
var foo = function()
{
console.log("Original Function");
this = function()
{
console.log("New Function");
}
};
console.log("Calling foo()");
foo();
Gewünschte Ausgabe:
Ursprüngliche Funktion
Aufruf von foo ()
Neue Funktion
Um die Fragen im Voraus zu beantworten: Ja, ich weiß, dass es andere Möglichkeiten gibt, dies zu tun. Ich bin nur neugierig, ob ich so etwas wie var bar = new foo();
machen und foo()
einige zeitabhängige Eigenschaften ohne zusätzliche Funktion zuweisen könnte.
BEARBEITEN: Antwort auf die Charmanders-Frage und eine etwas weniger vereinfachte, praktischere Anwendung
var node = function(parent)
{
this = function()
{
for (i in this)
{
// perform actions (which will occasionally include calling i()
}
}
if (parent !== null)
{
this.parent = parent;
// code to determine children
this.somechild = new node(this);
this.someotherchild = new node(this);
}
};
var ancestor = new node(new node(null));
3 Antworten
Das Zuweisen eines neuen Werts zu this
funktioniert nicht, aber Sie können einfach eine Funktion zurückgeben:
var foo = function() {
console.log("Original Function");
return function() {
console.log("New Function");
};
};
console.log("Calling foo()");
var f = foo(); /* or even: f = new foo(); */
f();
Ja, aber Sie tun dies nicht, indem Sie this
zuweisen:
function foo() {
console.log("original");
foo = function() {
console.log("new");
};
}
Sie weisen dem globalen Symbol "foo" lediglich einen neuen Wert zu, sodass der neue Wert zufällig eine Funktion ist.
Wenn Sie also foo()
zweimal aufrufen, wird beim ersten Mal "Original" und danach jedes Mal "Neu" gedruckt.
Der Wert von this
ist normalerweise nicht der Wert der Funktion, auf die verwiesen wird. es kann sein sein, aber Sie müssten eine etwas ungewöhnliche Situation einrichten. Selbst wenn dies der Fall wäre, können Sie this
keinen neuen Wert zuweisen.
Wenn Sie diese Technik verwenden möchten, müssen Sie der äußeren Funktionsvariablen direkt zuweisen:
var foo = function()
{
console.log("Original Function");
foo = function()
{
console.log("New Function");
};
};
Wenn die Funktion nicht wissen sollte, wo sie gespeichert ist, damit mehrere unabhängige Kopien der Funktion vorhanden sein können, möchten Sie wirklich eine Closure Factory verwenden:
function makeReplacingFunction() {
var fn;
fn = function() {
console.log("Original Function");
fn = function() {
console.log("New Function");
};
};
return function() { fn(); }
}
var foo = makeReplacingFunction();
foo();
foo();