2016-04-13 20 views
2

Ich bin neu in JavaScript und Node.js und lerne OOP und stieß auf zwei Möglichkeiten, eine Methode aufzurufen.Aufruf einer Methode auf zwei verschiedene Arten

Mein Code:

var Person = function(name) { 
    this.fName = name; 
}; 

Person.prototype.sayHello = function(){ 
    console.log("Hello, I am " + this.fName); 
} 

var person1 = new Person("mike"); 
person1.sayHello(); 

var helloFunction = person1.sayHello; 
helloFunction.call(person1); 

Ausgang:

Hello, I am mike 
Hello, I am mike 

Beide Anwendungen die gleichen Ergebnisse zu erzielen. Gibt es eine Situation, in der eine Version angemessener ist als die andere? Gibt es Vorteile/Nachteile für die beiden Anrufe?

+0

'Proper 'Art der Dinge zu tun ist umstritten. Es hängt alles von Ihrem Anwendungsfall ab. Versuchen Sie nur einer Konvention zu folgen, es sei denn, Sie können sie nicht vermeiden. – stackErr

+0

Als eine Randnotiz, siehe [this] (http://stackoverflow.com/questions/35949554/invoking-a-function-without-parentheses) – Amit

+1

Der zweite Weg ist nützlich, wenn Sie 'sayHello' an einen anderen gebunden aufrufen müssen 'this' Kontext, der auch eine 'fName'-Eigenschaft enthält. Abgesehen davon, versuchen Sie, den ersten Weg zu folgen, den Sie gefunden haben, und werfen Sie einen Blick auf die im Jahr 2015 eingeführten Schlüsselwörter "class" und "extends". – Chiru

Antwort

1

Gibt es eine Situation, in der eine Version geeigneter wäre als die andere?

Sie würden fast Exklusivität verwenden die normalen, func() wenn eine Funktion aufrufen. Die Verwendung von ist nicht dazu gedacht, ohne besonderen Grund verwendet zu werden, insbesondere unter Verwendung eines spezifischen Objekts wie dem this Wert.

Die willkürliche Verwendung von nicht standardmäßigen Codierungsmustern erzeugt unlesbaren, nicht wartbaren, fehleranfälligen Code.

+0

Dies. Die Verwendung von .call lässt mich denken, dass die Funktion ein völlig anderes Objekt ist, mit einer Methode namens call(), die mir auf den ersten Blick nicht bewusst ist. – hownowbrowncow

0

Beide sind echt. Es hängt davon ab, was Endspiel für die Ergebnisse ist. Die Verwendung von .call ist nützlich, wenn Sie eine Methode von einem Objekt auf einem anderen Objekt wiederverwenden möchten.

0

Im Allgemeinen würden Sie person1.sayHello() verwenden. Es ist prägnanter und einfacher zu lesen.

Wo möchten Sie verwenden sayHello.call ist, wenn das Objekt die fName Eigenschaft hat, aber nicht selbst eine sayHello Methode. Zum Beispiel:

var helloFunction = person1.sayHello; 
var pseudoPerson = { fName: "shadow mike" }; 
helloFunction.call(pseudoPerson); // "Hello, I am shadow mike" 
Verwandte Themen