Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中正确构造类_Javascript_Node.js_Oop_Architecture - Fatal编程技术网

Javascript 如何在Node.js中正确构造类

Javascript 如何在Node.js中正确构造类,javascript,node.js,oop,architecture,Javascript,Node.js,Oop,Architecture,我有一个名为TileStreamer的类,我目前定义如下: function TileStreamer { }; // Tiles are 256 x 256 pixels TileStreamer.prototype.TILE_SIZE = 256; // Header size in bytes TileStreamer.prototype.HEADER_SIZE = 28; // Various table entry sizes in bytes TileStreamer

我有一个名为
TileStreamer
的类,我目前定义如下:

function TileStreamer {

};
// Tiles are 256 x 256 pixels 
TileStreamer.prototype.TILE_SIZE = 256; 

// Header size in bytes
TileStreamer.prototype.HEADER_SIZE = 28; 

// Various table entry sizes in bytes 
TileStreamer.prototype.RESOLUTION_ENTRY_SIZE = 12; 
TileStreamer.prototype.TILE_COUNT_SIZE = 4; 
TileStreamer.prototype.TILE_ENTRY_SIZE = 12; 

// Offsets within header 
TileStreamer.prototype.WIDTH_OFFSET = 3; 
TileStreamer.prototype.HEIGHT_OFFSET = 4; 
TileStreamer.prototype.NUM_TABLES_OFFSET = 7; 
TileStreamer.prototype.UNPOPULATED_OFFSET = 12092;
这个类有常量,我定义如下:

function TileStreamer {

};
// Tiles are 256 x 256 pixels 
TileStreamer.prototype.TILE_SIZE = 256; 

// Header size in bytes
TileStreamer.prototype.HEADER_SIZE = 28; 

// Various table entry sizes in bytes 
TileStreamer.prototype.RESOLUTION_ENTRY_SIZE = 12; 
TileStreamer.prototype.TILE_COUNT_SIZE = 4; 
TileStreamer.prototype.TILE_ENTRY_SIZE = 12; 

// Offsets within header 
TileStreamer.prototype.WIDTH_OFFSET = 3; 
TileStreamer.prototype.HEIGHT_OFFSET = 4; 
TileStreamer.prototype.NUM_TABLES_OFFSET = 7; 
TileStreamer.prototype.UNPOPULATED_OFFSET = 12092;
还有其他变量。这些变量很重要,因为它们需要从其他类访问。它们在这个类的方法中获得它们的值。这就是我不确定的结构。我目前正在尝试的是:

TileStreamer.prototype.header; 
TileStreamer.prototype.resolutionEntry; 
TileStreamer.prototype.resolutionTable; 
TileStreamer.prototype.filepath; 
TileStreamer.prototype.s3; 
TileStreamer.prototype.level; 
TileStreamer.prototype.ncols; 
TileStreamer.prototype.nrows; 
TileStreamer.prototype.nlevels; 
TileStreamer.prototype.toffset; 
TileStreamer.prototype.tsize; 
TileStreamer.prototype.modifiedTime; 
TileStreamer.prototype.tile; 
TileStreamer.prototype.host; 
TileStreamer.prototype.bucket; 
此类还具有以下方法:

TileStreamer.prototype.Init = function(filepath, index, s3config){
   var retval = false; 
   AWS.config.update({accessKeyId: s3config.access_key, secretAccessKey: s3config.secret_key});
   var blc = new BlockLibraryConfigs(); 
   var awsConfig = blc.awsConfig; 
   AWS.config.update({region: awsConfig.region}); 

   var aws = new AWS.S3(); 
   var params = {
       Bucket: s3config.bucket, 
       Key: s3config.tile_directory + filepath, 
       Range: 'bytes=0-' + (this.HEADER_SIZE - 1)
   };

    aws.getObject(params, function(err, data){
       if(err == null){
            TileStreamer.modifiedTime = data.LastModified; 
            var header = bufferpack.unpack('<7I', data.Body);
            TileStreamer.header = header; 
            TileStreamer.nlevels = header[TileStreamer.NUM_TABLES_OFFSET]; 

            if(TileStreamer.nlevels == 5){
                TileStreamer.level = 0; 
                TileStreamer.ncols = Math.ceil((header[TileStreamer.WIDTH_OFFSET] * 1.0) / TileStreamer.TILE_SIZE); 
                TileStreamer.nrows = Math.ceil((header[TileStreamer.HEIGHT_OFFSET] * 1.0) / TileStreamer.TILE_SIZE);   

            }  
       }

    });     

}; 

只需将创建对象时要初始化的任何公共属性直接放在init函数中即可。这里有一个小例子

function TileStreamer() {
};

TileStreamer.prototype.Init = function() {
    this.modifiedTime = new Date();
}; 

var ts = new TileStreamer();
ts.Init();
console.log(ts);
jsfiddle示例

要解决在异步函数的回调中设置对象属性的问题,只需创建一个本地可访问的变量来引用您当时创建的对象

TileStreamer.prototype.Init = function() {
    var thisTileStreamer = this;
    asynchFunction(function(err, data) {
        thisTileStreamer.modifiedTime = data.lastModified;
    });
};
更进一步说,如果您需要在
init
函数完成后执行一些代码,那么也需要等待异步函数完成。为此,将另一个参数传递给
init
,这是在所有工作完成后要执行的函数

TileStreamer.prototype.Init = function(callback) {
    var thisTileStreamer = this;
    asynchFunction(function(err, data) {
        thisTileStreamer.modifiedTime = data.lastModified;
        callback();
    });
};

var ts = new TileStreamer();
ts.Init(function() {
    // put code here that needs to be executed *after* the init function has completed
    alert(ts.modifiedTime);
});

只需将创建对象时要初始化的任何公共属性直接放在init函数中即可。这里有一个小例子

function TileStreamer() {
};

TileStreamer.prototype.Init = function() {
    this.modifiedTime = new Date();
}; 

var ts = new TileStreamer();
ts.Init();
console.log(ts);
jsfiddle示例

要解决在异步函数的回调中设置对象属性的问题,只需创建一个本地可访问的变量来引用您当时创建的对象

TileStreamer.prototype.Init = function() {
    var thisTileStreamer = this;
    asynchFunction(function(err, data) {
        thisTileStreamer.modifiedTime = data.lastModified;
    });
};
更进一步说,如果您需要在
init
函数完成后执行一些代码,那么也需要等待异步函数完成。为此,将另一个参数传递给
init
,这是在所有工作完成后要执行的函数

TileStreamer.prototype.Init = function(callback) {
    var thisTileStreamer = this;
    asynchFunction(function(err, data) {
        thisTileStreamer.modifiedTime = data.lastModified;
        callback();
    });
};

var ts = new TileStreamer();
ts.Init(function() {
    // put code here that needs to be executed *after* the init function has completed
    alert(ts.modifiedTime);
});


最简单的方法是使用
this
前缀在init函数中声明属性。。。我只是想说同样的话。使用“this”或TileStreamer.prototype.modifiedTime=@因此,当我需要在异步函数中设置变量时,就像我在代码中所做的那样,我会使用
TileStreamer.prototype.modifiedTime=data.LastModified
set
modifiedTime
为同一个实例?@tibsar它将适用于所有实例。如果要管理TileStreamer的多个实例,请使用“this”,最简单的方法是使用
this
前缀在init函数中声明属性。。。我只是想说同样的话。使用“this”或TileStreamer.prototype.modifiedTime=@因此,当我需要在异步函数中设置变量时,就像我在代码中所做的那样,我会使用
TileStreamer.prototype.modifiedTime=data.LastModified
set
modifiedTime
为同一个实例?@tibsar它将适用于所有实例。如果您要管理TileStreamer的多个实例,那么在我的代码中使用“this”,诸如
modifiedTime
之类的内容是在异步函数中设置的,那么我将如何设置它们呢?我已经添加了一个额外的位来涵盖这一点。您面临的问题是,您创建了一个对象,然后试图为类的属性设置值。所以它不是对正在创建的对象的引用。好的,试试看。因此,我应该可以访问异步函数中的
thisTileStreamer
变量,而不将其作为参数传递?是的,它在匿名函数的作用域内。除了让它工作之外,它还让它看起来更容易:)看起来在
TileStreamer
类中一切都在工作,但是我在从另一个类中访问变量时遇到了问题。我试过
var TileStreamer=require('TileStreamer.js');var ts=新的TileStreamer();ts.Init(参数路径、索引、配置);var日期=ts.modifiedTime但是日期是未定义的。在我的代码中,诸如
modifiedTime
之类的内容是在异步函数中设置的,那么我该如何设置它们呢?我已经添加了一个额外的位来说明这一点。您面临的问题是,您创建了一个对象,然后试图为类的属性设置值。所以它不是对正在创建的对象的引用。好的,试试看。因此,我应该可以访问异步函数中的
thisTileStreamer
变量,而不将其作为参数传递?是的,它在匿名函数的作用域内。除了让它工作之外,它还让它看起来更容易:)看起来在
TileStreamer
类中一切都在工作,但是我在从另一个类中访问变量时遇到了问题。我试过
var TileStreamer=require('TileStreamer.js');var ts=新的TileStreamer();ts.Init(参数路径、索引、配置);var日期=ts.modifiedTime但日期未定义