繁体   English   中英

使用成员 function 修改 javascript 中 class 属性的值

[英]Using a Member function to modify the value of a class attribute in javascript

模式和问题描述

这似乎微不足道,但我要摆出的姿势永远不会少,因为我找不到一个简单清晰的例子。 请注意,如果您以 function 响应并且未声明 class,那么我不会接受将其作为解决方案。 我确实知道 JS 认为类是 function...

  1. 我定义了一个 class
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM