2017-01-14 3 views
0

Ich bin neugierig, wie auf eine andere Objekteigenschaft in module.exports zugreifen.Wie auf Objekteigenschaft in module.exports zugegriffen wird

hier ist der Fall:

module.exports = { 
 

 
    text: 'abcd', 
 
    index: (req, res)=>{ 
 
    console.log(text) <-- is not defined 
 
    console.log(this.text) <-- undefined 
 
    } 
 
}

gut dann, wie die Text-Eigenschaft zugreifen? Danke Leute brauchen deine Erklärung.

+0

erreichbar mich immer noch überrascht, wie jemand über [Pfeil-Funktionen] lernen können (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenz/Funktionen/Arrow_functions), ohne etwas über ['this'] zu erfahren (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this). –

+0

die beste Praxis, um es durch gefundenen Fall während der Codierung zu lernen: D danke für die Erinnerung an mich. @FelixKling –

+1

Stapelüberlauf funktioniert nicht gut, wenn Sie Ihre Frage bearbeiten, um eine völlig andere Frage zu stellen. Ihre ursprüngliche Frage enthält die Pfeilsyntax für die Definition von "index", was ich beantwortet habe. Als du deine Frage bearbeitet hast, nachdem ich meine Antwort geschrieben habe, hast du den ganzen Punkt dieser Frage/Antwort irgendwie ruiniert. Bitte tue das nicht. Ich schlage vor, dass Sie Ihre Frage so stellen, wie Sie sie ursprünglich gestellt haben, damit die Antworten immer noch relevant sind. Wenn Sie nach weiteren Informationen fragen möchten, können Sie entweder sehen, ob Sie diese Informationen über Kommentare erhalten oder Sie sollten eine neue/andere Frage stellen. – jfriend00

Antwort

3

JavaScript hat keine integrierte Möglichkeit, auf andere Eigenschaften im selben Objekt zu verweisen. Es gibt gute Gründe, warum dies nicht für irgendeine beliebige Eigenschaft tun kann. Sie müssen also entweder sicherstellen, dass this den richtigen Objektwert enthält, oder Sie müssen die entsprechende Objektreferenz selbst speichern, damit Sie sie erreichen können.

Hier ist ein Weg, in dem Sie das Objekt selbst Referenz speichern, die für ein Singleton-Objekt funktioniert gut:

let myObj = { 

text: 'abcd', 
index: (req, res)=>{ 
    console.log(myObj.text) 
} 

} 

module.exports = myObj; 

Wenn Sie wissen, dass .index() immer in geeigneter Weise als eine Methode auf Ihrem module.exports aufgerufen werden (die wäre der übliche Fall), dann können Sie aufhören, die => Definition zu verwenden und eine normale function Definition (die immer für Methodendeklarationen fast immer verwendet werden sollte) und dann this wird den gewünschten Wert haben.

module.exports = { 

text: 'abcd', 
index: function(req, res) { 
    console.log(this.text) 
} 
} 

Dies funktioniert solange .index() Index wie folgt aufgerufen wird:

let myModule = require('myModule'); 
myModule.index(req, res); 

Menschen neigen dazu, in der Liebe mit der Pfeil-Syntax zu fallen und vergessen, dass es nie für Methodendefinitionen ziemlich viel sollte verwendet werden, weil es this NICHT auf das Host-Objekt setzt, das Probleme für Methoden verursacht. Verwenden Sie stattdessen die normale function Definition für Methoden eines Objekts.


Pfeil Funktionen für Callback-Funktionen in der Regel sehr nützlich sind, wo Sie die Callback-Zugriff haben aus Ihrer Umgebung auf den this Wert wollen (der lexikalische Wert von this genannt). Hier sind einige nützlichen Beispiele:

class Timer { 
    delay(t, cb) { 
     this.timer = setTimeout(() => { 
      // preserve this value inside a callback 
      this.timer = null; 
      cb(); 
     }) 
    } 
} 

Oder

// preserve this value inside a callback 
let filtered = myArray.filter(item => { 
    return item.id !== this.master.id; 
}); 

Auf der anderen Seite kann man so ziemlich nie einen Pfeil Erklärung für ein Verfahren verwendet werden soll, weil das den üblichen Objektwert außer Kraft gesetzt wird für this und ersetzen Sie es durch einen lexikalischen Wert für this.

+0

Gute erklärung, aber ich wollte wissen, in welchem ​​scenorio können wir pfeil notation verwenden? Danke :) – ricky

+0

wie wäre es mit 'module.exports = { index() { this.text kann nicht den gewünschten Wert haben. } } ' im es6-Syntax verwenden –

+0

@ricky - Arrow-Funktionen sind explizit für, wenn Sie wollen, dass der 'this' Wert lexikalisch ist und nicht aus, wie die Funktion aufgerufen wurde. In Ihrem Fall ist der lexikalische Wert dieses "was auch immer" auf der obersten Ebene Ihres Moduls, es ist nicht Ihr Objekt. Sie können sich das lexikalisch als den Wert von "this" vorstellen, als dieser Code definiert wurde. Das ist einfach nicht das, was Sie wollen, daher ist die Pfeilsyntax nicht geeignet. Die Pfeilsyntax ist oft sehr geeignet, wenn Sie Callback-Funktionen angeben, bei denen Sie den lexikalischen Wert von "this" innerhalb des Callbacks beibehalten möchten. – jfriend00

0

Versuchen Sie, diese

module.exports = { 

     text: 'abcd', 
     index: function (req,res) { 
      console.log(this.text) 
     } 
    } 

über

var te=require('modulename') 
    te.index() 
Verwandte Themen