如何在module.exports中访问对象属性

7

我很好奇如何在module.exports中访问另一个对象属性。

这是一个例子:

module.exports = {

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

那么,如何访问文本属性呢?谢谢大家的解释。

仍然让我感到惊讶的是,有些人可以学习关于箭头函数,但却不了解this - Felix Kling
1
学习编程的最佳实践是在编码过程中找到案例。感谢你提醒我,@FelixKling。 - Good Day
2
当你编辑问题以使其成为完全不同的问题时,Stack Overflow 的效果并不好。你最初的问题包含了定义 index 的箭头语法,这也是我回答的内容。当你在我回答后编辑了问题,你破坏了整个问题/答案的意义。请不要这样做。我建议你将问题恢复到最初提出的方式,这样答案仍然相关。如果你想要进一步的信息,请尝试通过评论获取信息,或者提出一个新的/不同的问题。 - jfriend00
1
谢谢您告诉我,我已经拿回来了 @jfriend00 - Good Day
2个回答

13
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的通常对象值,并用词法值替换它。


很好的解释,但我想知道在哪些场景下我们可以使用箭头符号?谢谢 :) - ricky
请问以下代码怎么样?`module.exports = { index(){ this.text无法获得期望的值。 } }`我使用ES6语法。 - Good Day
@ricky - 箭头函数专门用于当您希望this值是词法的,而不是从调用函数的方式中确定的情况。在您的情况下,this的词法值是模块顶层的任何this值,而不是您的对象。您可以将词法this视为定义此代码时this的值是什么。这显然不是您想要的,因此箭头语法不适用。当指定回调函数并希望在回调内保留词法this值时,箭头语法通常非常适用。 - jfriend00
@ricky - 我在我的回答中添加了一些箭头函数示例。箭头函数不仅仅是一个应该始终使用的语法快捷方式。为了知道哪个适合使用,您需要知道使用箭头语法声明的函数和使用普通函数语法声明的函数之间的区别。如果您真的不确定要使用哪个,那么您可能应该坚持使用常规的 function 声明(在 ES5 和更早的版本中,我们都可以很好地使用它)。当您知道如何使用箭头函数时,箭头语法非常有用。 - jfriend00

0

试试这个

module.exports = {

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

通过访问

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接