如何使用模块导出直接返回对象?
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