如何在我的应用程序中组织jQuery

时间:2014-01-22 00:56:42

标签: javascript jquery jqgrid

所以我到了需要利用揭示模块模式或对象文字模式的地步,或者它们是否是相同的模式?我不知道。我理解揭示模块模式使用闭包但我的知识还不深。我过去研究过的揭示模块模式并且对它有点熟悉。

我目前的情况是我正在使用jqGrid,我想将常用设置和事件函数合并到一个core.js或global.js文件中,然后重用所有这些设置和回调函数(如onSortCol func)我创建一个新的jqGrid。我希望能够添加或编辑jqGrid的默认设置/选项,这使我无法使用对象文字模式或使用global.js文件中的默认设置显示模块模式进行设置。

我正在查看这篇文章:

http://rmurphey.com/blog/2009/10/15/using-objects-to-organize-your-code/

很快我想更好地了解这段代码的作用:

var myFeature = {
    config : {
        wrapper : '#myFeature',
        container : 'div',
        urlBase : 'foo.php?item='
    },

    init : function(config) {
        $.extend(myFeature.config, config);
        $(myFeature.config.wrapper).find('li').
            each(function() {
                myFeature.getContent($(this));
            }).
            click(function() {
                myFeature.showContent($(this));
            });
    },

    buildUrl : function($li) {
        return myFeature.config.urlBase + $li.attr('id');
    },

    getContent : function($li) {
        $li.append(myFeature.config.container);
        var url = myFeature.buildUrl($li);
        $li.find(myFeature.config.container).load(url);
    },

    showContent : function($li) {
        $li.find('div').show();
        myFeature.hideContent($li.siblings());
    },

    hideContent : function($elements) {
        $elements.find('div').hide();
    }
};

$(document).ready(function() { myFeature.init(); });

让我们从init函数开始吧。首先,配置“成员”是myFeature对象中的一个对象,这是正确的措辞吗?其次,init“成员”也是myFeature对象文字中的一个对象,或者因为它是一个函数,它的概念化方式与myFeature的配置“成员”不同吗?第三,可以像在myFeature对象中一样传递给init函数的配置范围是什么?看看这段代码,我希望在我的doc.ready中做到这一点:

 $(document).ready(function() { 
    var myF = new myF(); //new keyword not needed but can declared to emulate familiar
    object oriented programming concepts is what I think
    myF.init(myF.config); //I know I don't have to do this and this doesn't even make exact
    sense but just trying to express how my brain is working on this right now
 });

我将从那里开始,看看我得到了什么样的答案并相应地调整我的问题。

更新 所以config和init是myFeature的属性,init()可以传递一个可选的配置对象,它将覆盖并将传递的配置附加到目标myFeature.Config。

接下来的问题,在init实现中有$ .extend(myFeature.config,config)。为什么不行$ .extend(this.config,config)?这是我想要使用揭示模块模式的地方,因为我可以定义一个名为“self”的var,并在myFeature的包含成员中引用 this 。我不明白在对象文字模式中init属性如何在函数中访问myFeature。似乎myFeature是全局范围的,它的所有属性和本身都可以随时被任何人访问,我知道这是javascript的本质但是......

提前致谢!

2 个答案:

答案 0 :(得分:1)

回答你的问题:

  

接下来的问题,在init实现中有$ .extend(myFeature.config,config)。为什么不行$ .extend(this.config,config)?这就是我认为我想要使用揭示模块模式的地方,因为我可以定义一个名为“self”的var,并在myFeature的包含成员中引用它。我不明白在对象文字模式中init属性如何在函数中访问myFeature。似乎myFeature是全局范围的,它的所有属性和本身都可以随时被任何人访问,我知道这是javascript的本质但是......

JavaScript执行变量提升,这意味着解释器将对您的脚本块执行2次传递。第一遍将任何函数和变量声明提升到脚本块的顶部。第二遍将执行脚本块中声明的任何初始化。以下自执行脚本块可以轻松演示提升的工作原理。

// Original function block
var foo = 'string1';
(function() {
    alert(foo); // alerts undefined
    var foo = 'string2';
})();


// First pass, hoisting variables
var foo = 'string1';
(function() {
    // The var `foo` is hoisted to
    // the top of the script block
    var foo;
    alert(foo);
    foo = 'string2';
})();

提升完成后,代码将被执行。本地变量foo已被提升并在alert函数上方声明,因此当alert尝试访问fooundefinedmyFeature,因为它已声明但未声明初始化。 var new得到了提升,无论它是全局的还是包含在它自己的闭包中。这使它可以与对象文字中包含的其他属性一起使用。

另请注意,使用$.extend(myFeature.config, config);运算符不需要使用对象文字模式实例化。您也没有私有方法或属性。 myFeature myFeature.config可以存在且myFeature可能不存在。在运行时向对象文本{{1}}添加或覆盖当前属性或方法也很容易。您可以在此处阅读有关不同JS模式的更多信息:http://addyosmani.com/resources/essentialjsdesignpatterns/book/

答案 1 :(得分:0)

首先,那些“成员”是属性。

  

“对象是属性的集合,并且只有一个原型对象。原型可能是空值。” ECMA 4.3.3 object

接下来,init只是一个函数,分配给myFeature对象属性init。函数的核心也是对象brief demo

  

函数是“Object类型的成员,它是标准内置函数构造函数的一个实例,可以作为子例程调用。除了命名属性外,函数还包含可执行代码和状态,用于确定调用时的行为方式。“

第三,传递config的范围是您希望包含任何其他属性。 jQuery的extend($.extend(obj1,obj2))从obj2(一个对象)获取属性,然后将它们放在obj1(也是一个对象,在这种情况下总是myFeature.config,它是预配置的)simple demo