具有多个实例的javascript对象文字模式

时间:2010-10-12 09:13:37

标签: 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
    }
}

然后在我的页面中,我设置了我的探险家:

$j(function () {
    myExplorer.init();
}

顺便说一句,这一切都很好。问题是当我想在同一页面上拥有多个这些资源管理器样式小部件时。我试过传递不同的设置:

$j(function () {
    // first instance
    myExplorer.init();

    //second instance
    var settings = {
        $wrapper : $('#explorerCategories2'),
        $contentHolder : $j('#categoryContent2')
    }
    myExplorer.init(settings);

}

但是这只会覆盖第一个实例的配置值,这会有效地破坏它。我开始意识到对象文字模式不是去这里的方式,但我不确定是什么。任何人都可以提供任何指示吗?

5 个答案:

答案 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();