2016-04-16 6 views
-1

ich eine Klasse var Emp = function() { }; und dann Funktionen im Prototyp der Klasse definieren alsSoll ich die Konstruktormethode für den Prototyp oder für eine neu erstellte Instanz aufrufen?

Emp.prototype.function1 = function() { /* some definition */ }; 
Emp.prototype.function2 = function() { /* some definition */ }; 
// .. so on 

Was auf der Leistung seinen Einfluss würde und welcher Ansatz ist effektiv und warum?

Fall 1: Wenn ich rufe Funktion

Emp.prototype.function1(); 

Fall 2: wenn ich zum ersten Mal eine Emp Instanz

var empobj = new Emp(); 
empobj.function1(); // function calling 
+6

Was hat das mit jQuery zu tun? – Pointy

+2

Warum erstellen Sie Funktionen als Eigenschaften des Prototyps, wenn Sie keine Instanzen erstellen möchten? Fall 1 ist sinnlos. Fall 2 ist auch sinnlos, wenn die Funktionen nicht auf den Instanzen operieren, auf denen sie aufgerufen werden. – nnnnnn

+1

Fall 2 ist der Weg zu gehen –

Antwort

1

Wenn Sie den Fall 1, dann wird der this Kontext der wird darauf verwenden, erstellen prototype Objekt standardmäßig, daher die instance Werte können nicht zugegriffen werden, indem Sie das verwenden.

Zum Beispiel:

var x = function(){ this.a = 10 }; 
x.prototype.y = function(){ console.log(this.a) }; 
x.prototype.y(); // This will print undefined since 
//there is no properties other than y in the prototype of x. 

Zur gleichen Zeit im Fall 2, können Sie Zugriff auf das prototype Objekt sowie die instances Werte. Ein Beispielcode für das wäre,

var x = function(){ this.a = 10 }; 
x.prototype.y = function(){ console.log(this.a) }; 
var obj = new x(); 
obj.y(); // `y` can be accessed also. And it will output 10. 
1

Wenn die Methoden nicht auf Instanzen genannt werden, sollten sie statisch sein, dh in Emp statt in Emp.prototype definiert werden:

function Emp() { /* ... */ } 
Emp.function1 = function() { /* ... */ }; 

Oder mit ES6 Klassen:

class Emp { 
    static function1() { /* ... */ } 
} 

Dann ist die Funktion wie folgt aufrufen:

Emp.function1(/* arguments */); 
Verwandte Themen