2017-09-18 2 views
-1

I wie unten eine Printname Funktion haben:Wie kann ich function.prototype.property Funktionsnamen mit

function printName(name) { 
    console.log('Name is': , name); 
} 

Jetzt möchte ich printName.callAfter(3000, 'foo') auszuführen, das ist

‚Name log sollte: foo 'nach 3 Sekunden.

Ich versuchte Schreiben:

myName.prototype.callAfter = function(time, name) { 
    setTimeout(function() { 
    printName(name) 
    }, time); 
} 

Aber seine mir nur myName.prototype.callAfter als definierte Funktion zu geben, aber myName.callAfter ist nicht definiert.

Bitte helfen. Vielen Dank im Voraus

+1

In Ihrem 'printName' Funktion, wo kommt' name' kommen aus? Wolltest du es als Parameter akzeptieren oder 'this.' verwenden, oder stammt es wirklich aus dem Kontext? –

+1

'myName' ist nicht durch Ihren Code definiert. Sie sollten einen Referenzfehler erhalten. Versuchen Sie, eine [mcve] – Quentin

+0

@jass: 'printName' in Ihrer Frage akzeptiert keine Parameter. Also nochmal: Meinst du es hat 'name' in seiner Parameterliste? Wenn ja, bitte bearbeiten Sie die Frage, um das zu beheben. Live-Beispiele gehören auch ** in ** der Frage (über Stack Snippets, die '[<>]' Toolbar-Taste), nicht auf anderen Seiten. Off-Site-Links faulenzen, und die Leute sollten nicht außerhalb der Site gehen müssen, um Ihnen zu helfen. –

Antwort

1

Der Prototyp bewerben Sie werden sollte ist (buchstäblich) Function nicht der Name der Funktion. Wenn Sie dies tun, können Sie dann callAfter für jede definierte Funktion ausführen.

Das folgende scheint zu tun, was Sie wollten.

function printName(name) { 
 
    console.log('Name is: ' , name); 
 
} 
 

 
Object.defineProperty(Function.prototype, "callAfter", { 
 
    value: function(delay, args) { 
 
    var func = this; 
 
    setTimeout(function(){ 
 
     func.apply(func,args); 
 
    }, delay); 
 
    } 
 
}); 
 
printName("Instant"); 
 
printName.callAfter(3000,["After 3 seconds"]);

* (Ich verwende Object.defineProperty es so, dass callAfter nicht enumerable ist, was häufig wichtig ist, wenn Prototypen Einbau-Verlängerung.) *

Sie sollten Seien Sie sich bewusst, dass das Erweitern integrierter Objekte einige Probleme mit sich bringt.

+0

Vielen Dank für die Klarstellung. Das wollte ich eigentlich benutzen :) – jass

-1

Ich glaube, ich habe was Sie in diesem jsfiddle wollen arbeiten: https://jsfiddle.net/kd13ugwt/

function printName(name) { 
    console.log('Name is: ' , name); 
} 

printName.callAfter = function(time, name) { 
    setTimeout(function() { 
    printName(name) 
    }, time); 
} 

printName.callAfter(3000, 'foo'); 
Verwandte Themen