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
setmodifiedTime
为同一个实例?@tibsar它将适用于所有实例。如果要管理TileStreamer的多个实例,请使用“this”,最简单的方法是使用this
前缀在init函数中声明属性。。。我只是想说同样的话。使用“this”或TileStreamer.prototype.modifiedTime=@因此,当我需要在异步函数中设置变量时,就像我在代码中所做的那样,我会使用TileStreamer.prototype.modifiedTime=data.LastModified
setmodifiedTime
为同一个实例?@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代码>但日期未定义