我开发了一个小的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
}
}
然后在我的页面中,我设置了我的探险家:
$j(function () {
myExplorer.init();
}
顺便说一句,这一切都很好。问题是当我想在同一页面上拥有多个这些资源管理器样式小部件时。我试过传递不同的设置:
$j(function () {
// first instance
myExplorer.init();
//second instance
var settings = {
$wrapper : $('#explorerCategories2'),
$contentHolder : $j('#categoryContent2')
}
myExplorer.init(settings);
}
但是这只会覆盖第一个实例的配置值,这会有效地破坏它。我开始意识到对象文字模式不是去这里的方式,但我不确定是什么。任何人都可以提供任何指示吗?
答案 0 :(得分:9)
在对象文字上使用函数,因此您可以使用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() {
};
}
使用
根据需要立即显示此小部件的多个对象var foo = new myExplorer({ .. });
var bar = new myExplorer({ .. });
...
答案 1 :(得分: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
答案 2 :(得分:4)
使用以下代码实现此目的,请记住“公共API”(以便'内部'功能在'外部'可见'):
var myExplorer = function() {
var init = function(settings) {
var 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(config, settings);
}
// some more code...
},
var createExpanderLink = function() {
// more code
},
var anotherMethod = function() {
// etc
}
// Public API
// return the functions you want to use outside of the current instance
return {
init : init,
createExpanderLink : createExpanderLink,
anotherMethod : anotherMethod
}
}
var firstExplorer = new myExplorer();
var secondExplorer = new myExplorer();
// etc
答案 3 :(得分:2)
当您像这样调用$.extend()
时,它会将第二个对象的属性合并到第一个:
$.extend(myExplorer.config, settings);
相反,创建一个 new 对象,它是合并的结果,保持第一个对象(默认值)不变,如下所示:
this.settings = $.extend({}, myExplorer.config, settings);
这样做仍然将传递的对象合并到第一个,但第一个是新对象({}
),所以我们不会影响其他任何对象,只需使用this.settings
(或者使用不同的名称使其完全清楚)在你的对象内。
答案 4 :(得分:0)
根据我的理解,您正在尝试创建一个使用对象文字表示法定义的新对象实例。 可以使用Object.create方法实例化对象文字。 下面是解释如何从对象文字表示法实例化对象的代码。
var objLiteral = {
name:"kanthan",
address:'',
deliver:function(){
if(this.address){
console.log("Your product has been successfully delivered at "+this.address);
}
else{
console.log("please enter the address to deliver");
}
}
};
var cum=Object.create(objLiteral);
cum.address="gkm colony";
objLiteral.deliver();
cum.deliver();
var cum1=objLiteral;
cum1.address="gkm colony";
objLiteral.deliver();
cum1.deliver();