JavaScript中的OOP和jQuery失败
我正在开发一个项目,并且我正在尝试编写面向对象的JavaScript代码。 我刚开始阅读道格拉斯克罗克福德的JavaScript:The Good Parts,我很快就开始意识到用JavaScript编写Java-esque OOP将是一项艰巨的任务。
到目前为止,我已经写了类似下面的内容......
// index.html
$(document).ready(function() {
$().SetUpElements();
});
// this is in a different js file
$.fn.SetUpElements = function() {
// do stuff here
$().UpdateElement();
};
// this is in yet another different js file
$.fn.UpdateElement = function() {
// do stuff here
var element = new Element(id, name); // continue doing work
};
function Element(id, name) {
var id = id;
var name = name;
// other stuff
};
......这个想法是我希望尽可能地重构和分离对象/函数; 我想尽可能多地重复使用代码。 我已经将很多代码分布在不同的.js文件中,旨在将特定的相关代码分组在一起,就像您将使用Java编写不同的类一样。
正如我已经了解更多关于jQuery的知识,我意识到符号$.fn.foo = function() { ... };
实际上是将这个foo
函数添加到所有jQuery对象的原型中。 这是我应该做的事吗? 我以某种方式滥用jQuery?
我将不胜感激关于如何改进我在JavaScript中使用OOP的方法的建议,我很想看到有关讨论此主题的参考资料/教程/文章/等等。 即使选择了答案,也请随时提供反馈意见。 我正在寻找你的建议...这就是为什么我张贴:)
**注意:我没有开发jQuery插件。 我正在开发一个Web应用程序,并大量使用jQuery。
我会说你创建方法的第一种方式是滥用jQuery。 jQuery.fn.foo
语法通常保留给作用于DOM元素但通过使用空的jQuery对象使用它们作为静态函数的函数。
如果你想在jQuery命名空间下创建静态函数,你可以这样做:
jQuery.foo = function(){};
然后通过以下方式致电
jQuery.foo();
代替:
jQuery.fn.foo = function(){};
这可以让你做到:
jQuery('#someElementId').foo();
在OOP方面。 有很多不同的方法(模块模式,原型,工厂...)。 我通常的做法是创建一个类作为静态函数,然后用关键字new
调用它
(function($){
var undefined;
$.ClassName = function(options){
var self = this;
var cfg = $.extend(true, {}, this.defaults, options);
// ********************
// start:private
// ********************
function _init(){
};
// ********************
// start:public
// ********************
this.methodName = function(){
};
_init();
};
$.ClassName.prototype.defaults = {};
})(jQuery);
在重用功能方面,有一个门槛,在此之后,解耦比任何事情都更有害。 确保您保持模块化和组织的正确平衡。
如果它不是一个jQuery插件,我会写这样的东西:
var app = {
init: function(){
app.SetUpElements();
},
SetUpElements: function() {
return 'something';
},
etc: function() {
}
};
$(document).ready(app.init);
参考在JavaScript中做OO,你应该看道格拉斯克罗克福德的高级Javascript课程
链接地址: http://www.djcxy.com/p/17073.html上一篇: esque OOP in JavaScript and a jQuery fail
下一篇: How to isolate my javascript code to prevent collisions?