2017-01-14 11 views
0

module.exportsの別のオブジェクトプロパティにアクセスする方法が不思議です。ここmodule.exportsのオブジェクトプロパティにアクセスする方法

はケースです:うまく

module.exports = { 
 

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

、その後、textプロパティにアクセスする方法?おかげであなたの説明が必要です。

+0

を経由してアクセスしてみてください/ web/JavaScript/Reference/Functions/Arrow_functions)を参照してください(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)。 –

+0

コーディング中に発見されたケースでそれを学ぶベストプラクティス:Dは私に思い出させるために感謝します。 @FelixKling –

+1

質問を編集して全く別の質問にすると、スタックオーバーフローがうまくいかない。あなたの元の質問には、私が答えたものである 'index'の定義のための矢印構文が含まれています。あなたが私の答えを書いた後にあなたの質問を編集したとき、あなたはこの質問/回答の全体を一掃しました。しないでください。私はあなたが最初に尋ねたやり方であなたの質問を元に戻し、答えがまだ関係していることをお勧めします。さらに詳しい情報を求めたい場合は、コメントを使ってその情報を入手できるかどうかを確認するか、新しい/別の質問をする必要があります。 – jfriend00

答えて

3

Javascriptには、同じオブジェクト内の他のプロパティを参照する組み込みの方法がありません。任意のプロパティに対してこれを行うことができない理由は十分あります。したがって、thisに正しいオブジェクト値があることを確認するか、適切なオブジェクト参照を自分でどこかに保存する必要があります。

ここでは、シングルトンオブジェクトのために正常に動作され、自分自身を参照するオブジェクトを保存する方法です:

let myObj = { 

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

} 

module.exports = myObj; 

あなたは.index()は、常にあなたのmodule.exports(上のメソッドとして適切に呼び出されることがわかっている場合通常の場合)、=>定義の使用を中止し、通常のfunction定義(メソッド宣言にはほとんど常に使用する必要があります)を使用して、thisが望ましい値になります。

module.exports = { 

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

これは限り.index()インデックスは、このように呼ばれるように動作します:

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

人々は、矢印構文と恋に落ち、それがメソッドの定義に使用しないことがほとんどでくださいことを忘れがちこれはメソッドの問題を引き起こすホストオブジェクトにthisを設定しないためです。代わりに、オブジェクトのメソッドには通常のfunction定義を使用します。


アロー機能は、通常は、コールバックは、ご使用の環境からthis値へのアクセスを許可するコールバック関数のために非常に有用である(thisの字句値と呼ばれます)。ここではいくつかの有用な例です:一方

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

それとも

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

が、あなたはそれが通常のオブジェクトの値を上書きするための方法のための矢印宣言を使いたいんほとんどありませんthisの場合は、thisの字句値に置き換えます。

+0

良い説明だが、私はすべてのscenorioで我々は矢印表記を使用することができますか?ありがとう:) – ricky

+0

how about 'module.exports = { index(){ this.textは希望の値を持つことができません。 } } ' 私はes6構文を使用しています –

+0

@ arrowy - 矢印関数は、' this'値を字句にして、関数がどのように呼び出されたかによって決まらないようにするために明示的に使用します。あなたのケースでは、これの字句値は 'this'があなたのモジュールの最上位レベルにあるものであり、あなたのオブジェクトではありません。これは、このコードが定義されたときの 'this 'の値であったものと考えることができます。それは単にあなたが望むものではないので、矢印の構文は適切ではありません。矢印構文は、 'this 'の字句値をコールバック内に保持したい場合に、コールバック関数を指定するときにしばしば適切です。 – jfriend00

0

誰かがhttps://developer.mozilla.org/en-US/docs([矢印機能]について学ぶことができますどのようにそれはまだ私を驚かこの

module.exports = { 

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

var te=require('modulename') 
    te.index() 
関連する問題