所以我到了需要利用揭示模块模式或对象文字模式的地步,或者它们是否是相同的模式?我不知道。我理解揭示模块模式使用闭包但我的知识还不深。我过去研究过的揭示模块模式并且对它有点熟悉。
我目前的情况是我正在使用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的本质但是......
提前致谢!
答案 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
尝试访问foo
时undefined
为myFeature
,因为它已声明但未声明初始化。 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