Javascript JQuery插件架构,在哪里定义对象和变量生命周期?
我正在编写一个jquery插件来在画布中渲染图像 最终目标是实现以下目标Javascript JQuery插件架构,在哪里定义对象和变量生命周期?,javascript,jquery,jquery-plugins,requestanimationframe,Javascript,Jquery,Jquery Plugins,Requestanimationframe,我正在编写一个jquery插件来在画布中渲染图像 最终目标是实现以下目标 var myImageSource = new ImageSource(path,width,height); $("#myCanvas").Render({"source" : myImageSource}); 该插件需要几个类、herpers和其他一些jquery插件才能正常工作 假设我依赖于 鼠标滚轮jquery插件 一个缓存库,它不是jquery插件,而是一个具有原型和一些枚举的对象 我有一个动画引擎,它是一个
var myImageSource = new ImageSource(path,width,height);
$("#myCanvas").Render({"source" : myImageSource});
该插件需要几个类、herpers和其他一些jquery插件才能正常工作
假设我依赖于
鼠标滚轮jquery插件
一个缓存库,它不是jquery插件,而是一个具有原型和一些枚举的对象
我有一个动画引擎,它是一个循环,需要一个全局变量,或者至少在插件级别
function runAnimations(timeStamp) {
window.requestAnimationFrame(runAnimations);
for (var i = 0; i < animations.length; i++) {
animations[i].update(timeStamp);
}
}
我必须定义自己喜欢的对象
指向
长方形
视区
影像源
动画1
所以我的尝试是这样的:
- Reference to other script library (like Cache)
- Reference to other JQuery Plugin
; (function ($, window, document, undefined) {
//global variable declaration
var animations = [];
var isAnimationLoopStarted = false;
//global functions
function runAnimations(timeStamp) {
window.requestAnimationFrame(runAnimations);
for (var i = 0; i < animations.length; i++) {
animations[i].update(timeStamp);
}
}
//objects declarations
function Rect(x, y, height, width) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
Rect.prototype.moveTo = function (x, y) {
this.x = x;
this.y = y;
};
//other object declarations Point, ImageSource, ViewPort etc..
//plugin interface
var methods = {
init: function () {
return this.each(function () {
});
});
},
destroy: function () {
return this.each(function () {
});
}
};
$.fn.render = function (method) {
if (method === 'destroy') {
return methods.destroy.apply(this);
} else {
return methods.init.apply(this);
}
}
})(jQuery, window, document);
因此,我的问题是:
你认为这样行吗?
如果我这样做,ImageSource的定义在外部将不可用
插件
我应该放弃ImageSource对象而使用数组吗
对象定义没有问题
在插件式动画中定义的全局变量的生命周期是什么,它会一直可用吗?
使用动画之类的变量是最佳做法还是更好
使用.data jquery函数,但在本例中如何共享
变量
提前感谢您的帮助
弗雷德所以我的答案是:
看起来不错。然而,在闭包参数中,不需要窗口或文档,它们是简单的全局变量。只有当您想重命名它们时,才需要它们,例如,将它们重命名为global和doc。我宁愿将脚本库接口对象作为函数的参数。
对但是构造函数是否需要在外部可用?我认为没有。如果你真的需要它们,可以在闭包内声明它们;例如,在诸如$.render之类的静态属性中导出它们。
你需要给我们ImageSource的代码,否则我们无法回答这个问题
您没有在插件中定义任何全局变量,请修改您的评论。它们是局部变量,而不是插件闭包中的私有变量,可用于该范围内的所有其他内容。它们的生命周期将随着自动垃圾收集而结束,而不再有任何东西可以引用它们。但是您将函数导出到$.fn.render,它始终具有这些引用。因此,只要导出存在,您的局部变量就会存在。
您应该钩住jQuerys动画队列。在没有.data的情况下,如何共享变量?我想说的是,属于某个DOM节点的所有内容都应该设置为数据属性,否则在初始化之后就无法访问它了,是吗?
可怕的问题标题。你能试着把它变成一个问题吗?我改变了标题,我希望现在更好。谢谢你回答了我这么大的帮助。因此,var方法将在导出的生命周期内保留,因为它在导出中被引用,如果它不是引用,那么如果收集器启动,它可能会被垃圾收集。