Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 类-访问数据并销毁它们?_Javascript_Jquery - Fatal编程技术网

Javascript 类-访问数据并销毁它们?

Javascript 类-访问数据并销毁它们?,javascript,jquery,Javascript,Jquery,在循环(通过图像循环)的内部,我有: 这是一个允许用户裁剪图像的类 它获取可拖动框的偏移量、宽度和高度,从而创建裁剪 然后需要将这些数据发送到服务器进行图像处理 我只是想知道最好的方法是: A) 将图像上的裁剪详细信息存储在数据属性中,然后当用户单击“保存”时,循环并取整这些信息 B) 是否有一种方法可以在以后访问每个FileCrop类并执行类似于crop.getCrop()的操作?如果是这样,我以后如何访问每个类 我还想知道,当我保存数据时,如果成功,我会从屏幕上删除图像。我将使用jquery

在循环(通过图像循环)的内部,我有:

这是一个允许用户裁剪图像的类

它获取可拖动框的偏移量、宽度和高度,从而创建裁剪

然后需要将这些数据发送到服务器进行图像处理

我只是想知道最好的方法是:

A) 将图像上的裁剪详细信息存储在数据属性中,然后当用户单击“保存”时,循环并取整这些信息

B) 是否有一种方法可以在以后访问每个FileCrop类并执行类似于crop.getCrop()的操作?如果是这样,我以后如何访问每个类

我还想知道,当我保存数据时,如果成功,我会从屏幕上删除图像。我将使用jquery remove()来实现这一点。我想知道我创建的所有FileCrop类都发生了什么,这些类是否需要清理?如果是这样,如何存储?

jQuery可以存储任何对象,因此您不必尝试将数据存储为数据属性字符串。您可以存储整个
crop
对象,而无需进行任何序列化:

var crop = new lx.FileCrop(img);
$('#yourElement').data('crop', crop);

// retrieve it later
var myCrop = $('#yourElement').data('crop');
或者,您可以将裁剪对象存储为普通DOM元素的属性—无jQuery。这也不需要序列化

var crop = new lx.FileCrop(img);
$('#yourElement')[0].myCrop = crop;
// or
document.getElementById('yourElement').myCrop = crop;

// retrieve it later
var myCrop = $('#yourElement')[0].myCrop;
我创建的所有FileCrop类会发生什么情况,这些类是否需要清理? 垃圾收集器将自动搜索不再可访问的变量并清除它们。对于上面的纯DOM元素方法,这是非常简单的,因为如果从DOM中删除元素,并且无法访问对元素或裁剪对象的引用,那么它们将被清除

jQuery
.data()
方法更复杂,因为数据不存储在元素本身,jQuery维护和管理包含数据的
$.cache
结构。你可以阅读更多关于它是如何工作的


有关常规垃圾收集的更多信息,请访问。

它们存储数据的方式实际上取决于您的需要。您可以将一些ID存储在DOM中并构建一个指向对象的映射,也可以通过分析节点根据需要创建实例。很难说你提供的信息到底能起到什么作用,但你可以用很多方法来做到这一点

对于B-如果将对象存储在顶级变量(数组或对象)中的某个位置,则可以从局部函数作用域访问它们

至于最后一点,JavaScript对象与DOM是分开的,因此删除节点不会删除对象。JavaScript中没有一种明确定义的删除对象的方法,但当您了解它的工作原理时,这样做相对容易


当对象超出范围(您在本地声明它们的函数已完成执行)或不再有任何对象指向它们时,对象将被删除—这意味着当您在任何地方都没有引用这些对象时,它们将被垃圾收集器标记为自动移除。明确确保发生这种情况的一种方法是将它们指定为null
crop=null

谢谢,是否有某种探查器,我可以看到哪些对象被删除?如果您使用的是Chrome,那么有很多工具可供您使用。只需按F12。您可以拍摄堆快照(在profiling选项卡中),它将准确地告诉您内存是如何分布的。在Firefox中,按Shift+F5将裁剪对象添加到我的元素中有什么缺点吗?与其他方法相比,性能方面的优势是什么?我看不出有任何普遍的缺点。
var crop = new lx.FileCrop(img);
$('#yourElement')[0].myCrop = crop;
// or
document.getElementById('yourElement').myCrop = crop;

// retrieve it later
var myCrop = $('#yourElement')[0].myCrop;