ben*_*enb 9 javascript jquery object
我开发了一个小的javscript小部件来将一些嵌套的<ul>块转换为Windows资源管理器样式的浏览器.我最近了解了对象文字模式,并决定试一试,所以我的代码组织是这样的:
var myExplorer = {
init : function(settings) {
myExplorer.config = {
$wrapper : $('#explorerCategories'),
$contentHolder : $j('#categoryContent'),
loadingImg : '<img src="../images/standard/misc/ajax_loader.gif" alt="loading" class="loading" />'
}
// provide for custom configuration via init()
if (settings && typeof(settings) == 'object') {
$.extend(myExplorer.config, settings);
}
// some more code...
},
createExpanderLink : function() {
// more code
},
anotherMethod : function() {
// etc
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的页面中,我设置了我的探险家:
$j(function () {
myExplorer.init();
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这一切都很好.问题是当我想在同一页面上拥有多个这些资源管理器样式小部件时.我试过传递不同的设置:
$j(function () {
// first instance
myExplorer.init();
//second instance
var settings = {
$wrapper : $('#explorerCategories2'),
$contentHolder : $j('#categoryContent2')
}
myExplorer.init(settings);
}
Run Code Online (Sandbox Code Playgroud)
但这只是覆盖第一个实例的配置值,这有效地打破了它.我开始意识到对象文字模式不是去这里的方式,但我不确定是什么.谁能提供任何指针?
在对象文字上使用函数,因此可以使用new关键字实例化窗口小部件的多个对象.
function myExplorer(settings) {
// init code here, this refers to the current object
// we're not using a global object like myWindow anymore
this.config = {
$wrapper : $('#explorerCategories'),
$contentHolder : $j('#categoryContent'),
..
};
// provide for custom configuration
if (settings && typeof(settings) == 'object') {
$.extend(this.config, settings);
}
this.someFunction = function() {
..
};
this.otherFunction = function() {
};
}
Run Code Online (Sandbox Code Playgroud)
使用时,根据需要立即显示此小部件的多个对象,
var foo = new myExplorer({ .. });
var bar = new myExplorer({ .. });
...
Run Code Online (Sandbox Code Playgroud)
小智 9
那这个呢?
var myExplorer = function(settings) {
var o = {
init: function() {
this.somevalue = settings;
},
whatever: function() {
}
};
o.init();
return o;
};
var exp1 = myExplorer('something');
var exp2 = myExplorer('anything');
console.log(exp1.somevalue); //something
console.log(exp2.somevalue); //anything