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

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)

但这只是覆盖第一个实例的配置值,这有效地打破了它.我开始意识到对象文字模式不是去这里的方式,但我不确定是什么.谁能提供任何指针?

Anu*_*rag 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() {

    };
}
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