Javascript工作程序丢失属性

Javascript工作程序丢失属性,javascript,prototype,cluster-analysis,web-worker,Javascript,Prototype,Cluster Analysis,Web Worker,我正在开发一个网络应用程序,它可以在地图上显示聚集的闪电事件,所以一个巨大的聚集就像一个雷雨形成 为了避免“冻结”用户界面,我使用Javascript工作程序来执行集群。算法完成时会出现问题,因为它返回一个自定义对象,在我将其发送到主页面后,该对象会“丢失”一些属性: //inside Worker.js var cluster = new DBSCAN(e.data.params).run(); self.postMessage({"cluster": cluster}); 簇对象基本上是一

我正在开发一个网络应用程序,它可以在地图上显示聚集的闪电事件,所以一个巨大的聚集就像一个雷雨形成

为了避免“冻结”用户界面,我使用Javascript工作程序来执行集群。算法完成时会出现问题,因为它返回一个自定义对象,在我将其发送到主页面后,该对象会“丢失”一些属性:

//inside Worker.js
var cluster = new DBSCAN(e.data.params).run();
self.postMessage({"cluster": cluster});
簇对象基本上是一组地质点对象,因此:

cluster[0]
是这样的一个地质点对象吗

function GeoPoint(lat, lng){
    this.lat_ = lat;
    this.lng_ = lng;
}
GeoPoint.prototype.lat = function(){ return this.lat_;}
GeoPoint.prototype.lng = function(){ return this.lng_;}
当我用self.postMessage发送这个对象时,我丢失了lat和lng函数,我需要它们来绘制多边形。尽管如此,lat_uuuu和lng_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我能做些什么来克服这个问题?现在我只是简单地在结果上循环并重建GeoPoint对象,这很有效,但看起来很糟糕

谢谢你的建议


编辑:我需要这些函数,因为绘图代码将在计算凸包之前对纬度点执行排序。

根据文档,postMessage使用结构化克隆算法。功能和原型不被转移:

接收数据后,您可以尝试更改接收对象的原型:

worker.onmessage = function(event) {
    var data = event.data;
    data.forEach(function(p) {
        p.__proto__ = GeoPoint.prototype; // That seems to work, but I'm really not sure if this is standard and compatible with all browsers !
    });
};
我能做些什么来克服这个问题

Nothing-postMessage使用的不传输原型和函数。在另一边重建它们是必要的

现在我只是简单地在结果上循环并重建GeoPoint对象,这很有效,但看起来很糟糕

不,这就是我们需要做的:

var newCluster = messageData.cluster.map(function(likeapoint) {
    var point = new GeoPoint();
    for (p in likeapoint)        // maybe a static list of copied property names
        point[p] = likeapoint[p];// is faster, but not as flexible
    return point;
})

// since all properties are settable as arguments in this specific case:
var newCluster = messageData.cluster.map(function(likeapoint) {
    return new GeoPoint(likeapoint.lat_, likeapoint.long_);
})

不,这正是你需要做的。功能无法跨工作边界传输。您为什么需要这些lat/lng方法?普通对象{lat:…,lng:…}会不会简单得多?绘制多边形的框架会调用这些方法,这就是我需要它们的原因。你能在边界的另一边重新创建函数吗?这不是很理想,但是功能很简单,可能会很快工作。你是什么意思?我在主页中重新创建了GeoPoint对象,为每个结果调用新的GeoPoint,这“重建”了我需要的函数。由于某种原因,这不起作用。我得到的对象没有“lat”方法显然不起作用。我不知道为什么。我永远不会完全理解原型…尝试替换p.prototype=GeoPoint.prototype;使用p.。\uuuu proto\uuu=GeoPoint.prototype;。这似乎是可行的,但我真的不确定这是否是标准的,是否与所有浏览器兼容!分配给p.prototype永远不起作用。分配给p?