2015-12-19 4 views
5

Ich habe 3 Codes bekam:Verwenden Sie dies oder neu in JS?

var control = new Control(); 

function Control() { 

    this.doSomethingElse = function() {...} 
    this.doSomething = function() { 
     control.doSomethingElse(); 
    } 

} 

Oder

var control = new Control(); 

function Control() { 
    var self = this; 

    this.doSomethingElse = function() {...} 
    this.doSomething = function() { 
     self.doSomethingElse(); 
    } 
} 

Oder

var control = Control(); 

function Control() { 
    var self = this; 

    this.doSomethingElse = function() {...} 
    this.doSomething = function() { 
     self.doSomethingElse(); 
    } 

    return self; 
} 

Wichtig: Die Funktion ist ein Controller, und nur einmal erklärt. Dann verwende ich "Kontrolle" überall in meinem Code ...

Ich fragte mich, ob die control.doSomethingElse() langsam war?

Am Ende, was ist das Richtige zu tun und/oder der schnellste Code in diesem Beispiel?

Danke!

+1

# 1 ist falsch - ein Objekt sollte niemals intern den Namen verwenden, durch den es außerhalb bekannt ist. Dafür ist "this" (oder "self") da. – Alnitak

+0

@Alnitak: Er verwendet ein Singleton-Objekt.Scheint nicht, als ob er überhaupt einen Konstruktor braucht. –

+0

@squint true, aber in diesem Fall sollte er 'this' nicht in den Zuweisungen verwenden - nur' function Control() {return {doSomethingElse: ..., doSomething: ...}} ' – Alnitak

Antwort

3

Die erste ist falsch - ein Objekt sollte niemals intern den Variablennamen verwenden, von dem es außerhalb bekannt ist. Anderer Code könnte diese Variable ändern, um auf etwas anderes zu verweisen und diesen Code zu brechen.

Der dritter ist auch falsch - wenn Control() ohne new die Zuordnungen this.foo innerhalb Aufruf wird am Ende auf das globale Objekt befestigt zu werden (außer im Strict-Modus, in dem es keine impliziten this auf bloßen Funktionsaufrufen ist, so dass die Zuordnung zu this.doSomethingElse versucht, an undefined anzuhängen, was einen Laufzeitfehler verursacht).

Das lässt nur die zweite als angemessen, aber letztlich ist es eine Frage der Korrektheit, nicht der Leistung.

2

Definieren Sie keine Methoden im Konstruktor - das bedeutet, dass Sie sie jedes Mal definieren, wenn eine Instanz erstellt wird. Verwenden Sie stattdessen Control.prototype.foo = function() {}. Auch brauchen Sie nicht return this, wenn Sie neue Operator verwenden - das ist der Sinn von new Operator.

Der empfohlene Ansatz ist dies:

function MyClass(param1) { 
    // Here we're changing the specific instance of an object 
    this.property1 = param1; 
} 
// Prototype will be shared with all instances of the object 
// any modifications to prototype WILL be shared by all instances 
MyClass.prototype.printProperty1 = function() { 
    console.log(this.property1); 
} 

var instance = new MyClass("Hello world!"); 
instance.printProperty1(); // Prints hello world 

diesen Code zu verstehen, müssen Sie Javascript Prototyp-basierte Vererbung Modell verstehen. Wenn Sie eine Instanz von MyClass erstellen, erhalten Sie ein neues Objekt, das alle in MyClass.prototype vorhandenen Eigenschaften erbt. Read more about it.


Auch frage ich mich:

Die Funktion ist ein Controller, und nur einmal erklärt.

Wenn Sie diese nicht mehrmals verwenden, müssen Sie keine Klasse erstellen. Sie können dies stattdessen tun:

var control = {doSomething:function() { ... }}; 

Ich nehme an, Sie zu Java verwendet werden, wo alles eine Klasse sein muss, ob es Sinn macht oder nicht. Javascript ist anders, Sie können auch einzelne Objekte oder Funktionen nach Bedarf erstellen.

+0

Es gibt viele perfekt gut Gründe, Methoden im Konstruktor zu definieren, und ein Singleton ist einer von ihnen, da es keinen Overhead gibt, wenn mehrere Kopien der gleichen Funktionen immer wieder erstellt werden. Dogmatisch zu sein, tut mehr Schaden als Nutzen. – Alnitak

+0

@Alnitak Ich erwähnte, wie Singletons in Javascript definiert sind. Und ich bin nicht dogmatisch - ich habe den Grund erwähnt, warum ich OPs Vorgehen ablehne, es liegt an ihm, Entscheidungen zu treffen. –

+0

Hallo allerseits, danke für deine Antworten, ja, ich wurde mit Java geboren, und wie cleaner Code, Aber was ist mit der Leistung? Welche der Antworten hat die schnellste Ausführung/Zugriff? – alexino2

Verwandte Themen