开发者问题收集

如何使用模块导出直接返回对象?

2021-04-23
81

为什么 cat 类不能设置属性,而模块导出的是我传递的新对象。

TypeError: Cannot set property '#sound' of undefined

animal 类

class Animal
{
    #sound;
    
    // i make it return object this object class.
    setSound(sound)
    {
        this.#sound = sound;

        return this;
    }

    getSound()
    {
        return this.#sound;
    }
}

// i make it create object and return that object.
module.exports = new Animal;

cat 类

const {setSound} = require('./animal');

const cat = setSound('Meow');

console.log(cat.getSound());
2个回答

在 Javascript 中, this 仅指代 . 之前的内容。例如:

function t() {
     return this;
 }

 a = {t: t}
 a.t()
 // returns a

如果直接调用 t ,则会得到未定义的结果:

t()
 // undefined

因此,在您的情况下,您直接调用方法而不使用 . ,因此 this 未定义。

您可以通过两种方式修复它,一种是修复导入:

const cat = require('./animal');
cat.setSound('Meow') // This works because there is a period

或者使用 bind:

class Animal {
    constructor() {
         this.setSound = this.setSound.bind(this);
         this.getSound = this.getSound.bind(this);
    }

    // Other methods
}

这基本上“冻结”了 this 的值,并防止它在方法与实例断开连接时发生变化。

mousetail
2021-04-23

您导出类的实例,因此不能仅从中导入方法。请执行以下操作:

const CAT = require('./animal');

const cat = CAT.setSound('Meow');

console.log(cat.getSound());
deko_39
2021-04-23