javascript - 这个 JS 遵循什么类型的模式?

标签 javascript jquery

我最近遇到了类似的代码,

// Simplified example..
var Application = 
    {
        MemberVar1: null,
        MemberVar2: null,

        Initialize: function ()
        {
            Application.MemberVar1 = 'Foo';
            Application.MemberVar2 = 'Bar';

            console.log("Initializing..");

            Application.GetMemberVars();
        },
        GetMemberVars: function ()
        {
            console.log(Application.MemberVar1 + ' ' + Application.MemberVar2);    
        }
    };

$(Application.Initialize);

这个模式/方法/风格的名称是什么?利用 OOP 原则,而不使用我以前见过的风格,例如原型(prototype)设计。与其他流行的风格相比,这种风格有什么好处?

最佳答案

这是一个正在创建的简单的一次性对象文字...它们可以包含函数...也许这就是让您困惑的原因。

最后一行仅将 Application.Initialize 函数作为 $(document).ready 回调函数传递给 jQuery

根据下面的评论,这就是代码的实际用途(以及如何将其编写得更短/更容易)

$(function()
{
    console.log("Initializing..");
    console.log("Foo Bar");//replace this with variables you declare @top of anon. function if you want
});

作为模块(您可以找到有关模块模式 here 的更多信息):

var Application = (function()
{
    var memberVar1, memberVar2,
    getMemberVars = function()
    {
        return memberVar1 + ' ' + memberVar2;
    };
    return {init: function()
    {
        memberVar1 = 'Foo';
        memberVar2 = 'Bar';
        console.log('initializing...');
        console.log(getMemberVars());
    }};
}());
$(Application.init);

Application 现在是一个对象文字,只有 1 个属性 (init):一个函数,因为它是在 IIFE 范围内声明的,所以可以访问该范围内的所有局部变量。这就是闭包对你的魔力。您也可以轻松地为成员变量添加 getter 和 setter:

var Application = (function()
{
    var memberVars = {},//turned into object literal...
    getMemberVars = function(all)
    {
        var i;
        if(typeof all === 'string' || typeof all === 'number')
        {
            return memberVars[all];
        }
        all = [];
        for (i in memberVars)
        {
            if (memberVars.hasOwnProperty(i))
            {
                all.push(memberVars[i]);
            }
        }
        return all;//or all.join(' '), as you please
    },
    get = function(name)
    {

        return typeof name === 'undefined' ? name : memberVars[name]; 
    },
    set = function(name, val)
    {
        memberVars[name] = val;
    };
    return {init: function()
    {
        memberVars.one = 'Foo';
        memberVars.two = 'Bar';
        console.log('initializing...');
        console.log(getMemberVars().join(' '));
    },
    get: get,
    set: set};//just add getter and setter here
}());

关于javascript - 这个 JS 遵循什么类型的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346848/

相关文章:

javascript - 如何找到对象中第一个数组属性?

jquery - 我可以在 HTML 数字输入字段中使用 +- 代替箭头吗?

javascript - jquery - 自动完成网址

jquery - 使用 jQuery $(this) 对象删除元素不起作用

jquery - 通过 jQuery 悬停淡入淡出效果

javascript - 如何在 Tabledit jquery 中发送多个标识符

javascript - jQuery 发现不适用于音频源

javascript - 当用户 "sees"元素时激活 JavaScript?

javascript - 如何在 pixijs 中应用 png mask ?

javascript - 将事件附加到动态生成的 HTML?