Ich habe den genauen Code in die Konsole geschrieben und das Problem, mit dem ich bei diesem Code konfrontiert bin, ist:

  1. warum ist xyz.c definiert
  2. warum abc.count undefiniert ist

Code:

function setup()
{
   this.count = 0;
   return function() 
    {
       this.c = 1;
       return this.c;
    };
};
var abc = new setup();
abc.count;
//undefined 
var xyz = new abc();
xyz.c;
//1
-1
kingshuk basak 12 Aug. 2015 im 10:30

4 Antworten

Beste Antwort

Aus den MDN-Dokumenten auf dem {{X0 }}:

Das von der Konstruktorfunktion zurückgegebene Objekt wird zum Ergebnis von der ganz neue Ausdruck *. Wenn die Konstruktorfunktion dies nicht tut Wenn Sie ein Objekt explizit zurückgeben, wird das in Schritt 1 erstellte Objekt verwendet stattdessen. (Normalerweise geben Konstruktoren keinen Wert zurück, können dies aber Wählen Sie dies, wenn Sie die normale Objekterstellung überschreiben möchten Prozess.)

* Hervorhebung von mir

Was Sie hier tun, ist das Überschreiben des Standardverhaltens von new. Ihr Code entspricht dem Folgenden:

var abc = function() 
{
    this.c = 1;
    return this.c;
};
abc.c; // undefined. 

Obwohl Sie this.c deklariert haben, dass Ihr function() zu diesem Zeitpunkt noch nicht ausgeführt ist, ist this.c immer noch undefiniert.

Dann new abc mit dem traditionellen Ansatz, also:

var xyz = new function() {
    this.c = 1;
    return this.c;
};
xyz.c === 1; // Works, because you've new'd the function correctly

Angenommen, Sie versuchen, eine konterobjektorientierte Stilfunktion zu implementieren, könnten Sie Folgendes versuchen:

function setup()
{
   this.count = 0;
   this.increment = function() {
       this.count++;
   }
};
var counter = new setup();
counter.increment();
counter.increment();
console.log(counter.count); // 2
var counter2 = new setup();
counter2.increment();
console.log(counter2.count); // 1

Oder mit prototypischer Vererbung:

function setup() {}
setup.prototype.count = 0;
setup.prototype.increment = function() {
    this.count++;
};

Obwohl die Namenskonvention vorschreiben würde, sollten Sie Ihre Klasse so nennen:

function Counter() {
    this.value = 0;
    this.increment = function();
}
var first = new Counter();
2
CodingIntrigue 12 Aug. 2015 im 09:41

Typeof abc ist "function", die Objekt für den Zugriff auf abc.count sein sollte. Ich erhalte diesen Fehler beim Ausführen von "var xyz = new abc ();"

VM40: 7 Nicht erfasster Referenzfehler: Die Anzahl ist bei new (: 7: 17) um: 2: 11 bei Object.InjectedScript._evaluateOn (: 905: 140) bei Object.InjectedScript._evaluateAndWrap (: 838: 34) bei Object nicht definiert. InjectedScript.evaluate (: 694: 21)

Was ist nicht richtig. Ich frage mich, wie Sie 3 bekommen?

0
user4458951user4458951 12 Aug. 2015 im 08:09

Sie können sehen, dass typeof xyz ein Objekt ist und daher auf die Eigenschaft der Funktion zugreift. und typeof abc ist eine Funktion. Sie können nicht auf eine Eigenschaft mit Funktion zugreifen.

0
user4458951user4458951 12 Aug. 2015 im 09:30

JavaScript erstellt prototypisches Erbe. Sie versuchen, einen Konstruktor für eine Funktion aufzurufen, die wiederum eine Funktion zurückgibt.

Versuchen Sie console.log(setup), um zu sehen, was es enthält. Es ist kein Objekt, es hat keine count-Eigenschaft, es ist eine Funktion. Wenn Sie es über setup()() aufrufen, wird immer 1 zurückgegeben.

Was Sie wollen, könnte so funktionieren:

var Counter = {
    count: 0,
    increaseCount: function() {
         return ++this.count;        
    }
}

var abc = Object.create(Counter);
abc.increaseCount(); // 1
abc.increaseCount(); // 2
0
k0pernikus 12 Aug. 2015 im 08:28