[英]Using a Member function to modify the value of a class attribute in javascript
这似乎微不足道,但我要摆出的姿势永远不会少,因为我找不到一个简单清晰的例子。 请注意,如果您以 function 响应并且未声明 class,那么我不会接受将其作为解决方案。 我确实知道 JS 认为类是 function...
class MyClass{
constructor(input0){
this._input0 = input0;
this._input1 = [];
}
set_input1(){
/**
* in my case complex algebraic manipulation occurs inside this function
* by putting it inside of a function it encapsulates that
* in this the result is 123 ;)
*/
this._input1.push(123);
}
现在实际初始化 object,如下所示。 在这种情况下 input0 设置为 'foo'
myobj = new MyClass('foo')
myobj.set_input1()
console.log(myobj._input1) //returns empty array []
今天我正在用 nodejs 构建一个数据聚合器,但无法将它发送到 go。
ProjDb.js
class ProjDb {
constructor(_rsviewProjDirArr) {
this._rsviewProjDirArr = _rsviewProjDirArr; // Full file directory paths
this._allFileNameArr = [];
} // end constructor
set_allFileNameArr() {
this._rsviewProjDirArr.forEach((i) => {
fs.readdir(i, (err, files) => {
if (err) {
throw (err);
}
else {
files.forEach(file => {
if (path.extname(file) == ".DBF") {
this._allFileNameArr.push(file);
}
});
}
});
});
}
}// end classs = ProjDb
module.exports = ProjDb;
服务器.js
const XLSX = require('xlsx');
const util = require('util');
const ProjDb = require('./ProjDb.js');
let projDb = new ProjDb(
['./rsview-data/proj1',
'./rsview-data/proj2']);
projDb.set_allFileNameArr();
console.log(projDb._allFileNameArr.length); // result =0 but should be large number
我喜欢这种模式,因为在小型设备和复杂系统上调试非常容易。 我可以快速解决问题。 它还使代码易于阅读。 我唯一能想到的是,因为有一个 scope 包装了构造函数,所以我无法重新定义其中的值......我一直在 cpp 和 python 中这样做。 所以如果你能从这个角度解释我会喜欢的。 我认为这些都不应该失败。
在构造函数中你有this._input1 = [];
但是控制台是console.log(myobj.input1)
如果您修复名称拼写错误,则可以正常工作:
class MyClass{
constructor(input0){
this._input0 = input0;
this._input1 = [];
}
set_input1(){
/**
* in my case complex algebraic manipulation occurs inside this function
* by putting it inside of a function it encapsulates that
* in this the result is 123 ;)
*/
this._input1.push(123);
}
}
myobj = new MyClass('foo')
myobj.set_input1()
console.log(myobj._input1) // [123]
经过一番挖掘,我找到了一种方法。 看来您可以按照预期更新成员 function。 第二个示例中的**代码使用来自 fs 模块fs.readdir 的节点 function 。 经过审查,我发现文件是回调的关键字,必须使用,另外它返回的是 object 而不是数组。 因此必须使用内置的 toString() 成员将 object 转换为字符串数组。
这是工作副本
set_allFileNameArr() {
// rename i as dirpath
for (let i=0;i<this._rsviewProjDirArr.length;i++)
{
let _dirPath = this._rsviewProjDirArr[i];
var logstream = fs.createWriteStream('allFileNameArr.txt', {flas: 'a'});
console.log('Loading Data From Target Directory:\n\t'+_dirPath)
// Method 1
// (err,files) are 2 arguments for a callbqack function
fs.readdir(_dirPath, (err, _files)=>{
if (err) throw (err);
else {
// For loop style
for (let i=0;i<_files.length;i++){
if(path.extname(_files[i])==='.DBF'){
this._allFileNameArr.push(_files[i].toString());
logstream.write(_files[i].toString()+'\n')
}
}
}
}
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.