我最近遇到了类似的代码,
// 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/