[英]Global variables shared amongst Javascript Modules
我有一个脚本,希望将其分离为多个模块。 例如,将我所有的鼠标事件放在另一个模块中(mouseup,mousedown等)。
我使用了一堆全局变量来跟踪屏幕上的所有对象。 鼠标模块将需要访问这些变量并进行更改。 我意识到我可以揭示其他模块所需的每个变量,但是它们无法更改它们。
如何使用Java最佳实现? 我目前使用的是揭示性模块模式,并且我读到我必须使用getter和setter(例如,我从学校回忆起就使用过C ++),但是我要跟踪很多全局变量。 我需要很多这样的方法。 这是我应该这样做的方式吗?
或者...这是一个案例,向我表明一个问题描述了不良的设计。
我正在使用Fabric.js进行绘图和所有其他工作。
drawscript.js
var DrawScript = function(){
var DRAW = 0,
SELECT = 1,
SCROLL = 2;
var MOUSEBUTTONS = {
'S': 83,
'C': 67,
'D': 68,
'DELETE': 46,
'BACKSPACE': 8
};
var canvas;
var _started = false;
var _x, _y;
var square;
var edgedetection = 10; // pixels to snap
var lines = {};
var lines_group;
var rectangles_group;
var rectangle_txt = {};
var _text_offset_x = 20;
var _text_offset_y = 20;
var pressedKeys = [];
var _stroke_colour_var = "red";
var _stroke_width_var = 5;
var _selectionColor = "rgba(255,255,255,0.4)";
var _selectionBorderColor = "rgba(0,0,0,0.5)";
var selectedObjStartSettings = {};
var resetOpacityOfObject = false;
var drawingMode = true;
var mouseGlobal = null;
var garbage = null;
var window_height = 0;
var window_width = 0;
var canvasHeight = 0;
var canvasWidth = 0;
var bg_height = 0;
var _canvas_position = {
'x': {},
'y': {}
};
var _canvas_mouse_pos_x = 0;
var _canvas_mouse_pos_y = 0;
var _fullSizeOn = false;
var _fullWidth = 0;
var _fullHeight = 0;
var _fitWidth = 0;
var _fitHeight = 0;
var _scaleSizeWidth = 0;
var _scaleSizeHeight = 0;
var setCanvasSize = function(){
// stuff
},
checkDrawingMode = function(){
// stuff
},
checkKeyDown = function(e){
// stuff
},
saveDrawing = function(){
// stuff
},
deleteObjectFromCanvas = function (obj){
// stuff
},
setObjectStartPoints = function(){
// stuff
},
drawNewRect = function(top, left, width, height, name){
// stuff
},
updateCoords = function(x, y){
// stuff
},
changeZoom = function(input){
// stuff
},
init = function(){
garbage = $("#garbage");
// ===================================
// Set drawing mode when changed
// ===================================
$("input[name='draw']").change(function(){
checkDrawingMode();
});
// ===================================
// Zoom On
// ===================================
$("input[name='zoom-on']").change(function(){
changeZoom(this);
});
// ===================================
// Check keypress
// ===================================
$(document).keydown(function(e){
checkKeyDown(e);
});
$(document).keyup(function(e){
e.preventDefault();
var key;
if(e.metaKey)
{
// key = 91;
return;
}
else
key = e.keyCode;
pressedKeys[key] = false;
// console.log(pressedKeys);
});
// ===================================
// Save drawing
// ===================================
$("#save").click(function(){
saveDrawing();
});
$(window).resize(function(){
setCanvasSize();
});
// ===================================
// Create canvas and check drawing mode when launched
// ===================================
canvas = new fabric.Canvas('demoCanvas');
setCanvasSize();
checkDrawingMode();
canvas.selectionLineWidth = 2;
canvas.selectionDashArray = [4, 4];
canvas.cornerColor = "#900";
canvas.hoverCursor = 'pointer';
canvas.moveCursor = 'pointer';
canvas.selection = false;
// ===================================
// Add groups
// ===================================
rectangles_group = new fabric.Group();
lines_group = new fabric.Group();
canvas.add(lines_group);
// ===================================
// Get mouse events
// ===================================
canvas.on('mouse:down', function(options) { mousedown(options); });
canvas.on('mouse:move', function(options) { mousemove(options); });
canvas.on('mouse:up', function(options) { mouseup(options); });
canvas.on('object:scaling', function(e) { e.target.resizeToScale(rectangle_txt, _text_offset_x, _text_offset_y); });
canvas.on('object:selected', function() { setObjectStartPoints(); });
canvas.on('object:moving', function(options) { objectMoving(options); });
};
return {
init: init
};
}();
为了简洁起见,我已经删除了顶部的函数实现。 另外,我绝对需要使我的变量名在命名约定方面更加统一。 这一切都还很早,所以我很抱歉,如果这让任何人都想破坏我的膝盖!
我不确定如何拆分鼠标事件,因此我的drawScript.js文件不会变成3k行。 鼠标事件全部使用我设置的各种组和坐标变量。 另外,我需要在应用程序使用的脚本之间共享画布。
也许我只是在努力地努力和过度组织,但我认为寻求帮助将使我无论如何都可以在大型项目中变得更好:)
不要使用显示模块模式。 许多人从Addy Osmani的书中学习了“揭示模块模式”,而没有注意Addy的警告 。
如您所知,当您将闭包变量显示给其他模块时,就无法更改它们。 这是显示模块模式的根本缺陷。 你可能做了这样的事情
var mouse = (function(){
var x = 10, y = 20;
var drawLineTo = function(x1,y1){
console.log("Drawing line from " + x + "," + y + " to " + x1 + "," + y1);
};
return {
x: x,
y: y,
draw: drawLineTo
}
})
mouse.x = 50
mouse.draw(15,15) // print "Drawing line from 10,20 to 15,15"
并发现更改mouse.x
不会更改闭包中x
的值。 尽管您可以通过定义显式的getter和setter来解决此问题,
var mouse = (function(){
var x = 10, y = 20;
var getX = function() {return x};
var setX = function(val) {x = val};
var drawLineTo = function(x1,y1){
console.log("Drawing line from " + x + "," + y + " to " + x1 + "," + y1);
};
return {
getX : getX,
setX : setX,
y: y,
draw: drawLineTo
}
})
mouse.setX(50);
mouse.draw(15,15) // print "Drawing line from 10,50 to 15,15"
这是使用显示模块模式所付出的愚蠢代价。 更简单的是
var mouse = (function(){
// put your private variables and methods here.
return {
x : 10,
y: 20,
draw: function(x1,y1){
console.log("Drawing line from " + this.x + "," + this.y + " to " + x1 + "," + y1)
}
}
})
mouse.x = 50;
mouse.draw(15,15) // print "Drawing line from 50,20 to 15,15"
关键是永远不要透露-只将您打算隐藏的东西放到封口中。 旨在公开的事物应这样创建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.