Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建可以在JS文件之外访问的全局javascript对象?_Javascript_Oop - Fatal编程技术网

如何创建可以在JS文件之外访问的全局javascript对象?

如何创建可以在JS文件之外访问的全局javascript对象?,javascript,oop,Javascript,Oop,我在JS文件中有以下对象: var IOBreadcrumb = function IOBreadcrumb() { this.breadcrumbs = []; this.add = function(title, url) { var crumb = { title: title, url:url }; this.breadcrumbs.push(crumb); }; }; 在另一个JS文件中

我在JS文件中有以下对象:

var IOBreadcrumb = function IOBreadcrumb() {
    this.breadcrumbs = [];
    this.add = function(title, url) {
      var crumb = {
        title: title, 
        url:url
      };
      this.breadcrumbs.push(crumb);
    };
  };
在另一个JS文件中,我想利用这个对象:

//this occurs in some on click event
var breadcrumb = new IOBreadcrumb();
breadcrumb.add('some title',url);
console.log(breadcrumb.breadcrumbs);
我希望只有一个IOBreadcrumb实例,这样当我单击一个按钮时,它总是会将一个breadcrumb添加到数组中

我怎样才能做到这一点

var IOBreadcrumb = {
    breadcrumbs: [],
    add: function(title, url) {
      var crumb = {
        title: title, 
        url:url
      };
      IOBreadcrumb.breadcrumbs.push(crumb);
    }
  };
然后:


将以下内容作为页面执行的第一个javascript

(function(){
    var setup = function IOBreadcrumb() {
        this.breadcrumbs = [];
        this.add = function(title, url) {
            console.log('adding');
            var crumb = {
                title: title, 
                url:url
              };
            this.breadcrumbs.push(crumb);
        }
    };


  window.IOBreadcrumb = new setup();
})(window);
这就是初始设置。现在从任何你能做的地方

IOBreadcrumb.add()

我已经测试过了


这样做的目的是将
window.IOBreadcrumb
分配给立即执行的函数的结果。由于此函数没有句柄,因此无法重新执行它。由于将
IOBreadcrumb
放在窗口对象上,因此它实际上是全局的。我假设这是在浏览器中运行的;它不会在node.js或任何东西上运行,因为它依赖于
窗口

另一个选项是使用,它的好处是保持面包屑真正私有。但并不是每个人都喜欢模块模式,因为它可以防止猴子补丁。当您使用库并且需要修改行为,但又不想编辑它们的源文件以减少升级时的麻烦时,这一问题尤其严重

var IOBreadcrumb=(函数(){
var breadcrumbs=[];
返回{
添加:函数(标题、url){
面包屑({
标题:标题,,
url:url
});
},
each:函数(回调){
对于(变量i=0;i
抱歉,epascarello是JS新手,可能是从一个不好的网站学到的。最佳实践是什么?它对页面上的所有脚本都是全局的-通过window.IOBreadcrumbor访问-从任何地方只需IOBreadcrumb.add()——请参阅我的更新答案
(function(){
    var setup = function IOBreadcrumb() {
        this.breadcrumbs = [];
        this.add = function(title, url) {
            console.log('adding');
            var crumb = {
                title: title, 
                url:url
              };
            this.breadcrumbs.push(crumb);
        }
    };


  window.IOBreadcrumb = new setup();
})(window);
var IOBreadcrumb = (function() {
    var breadcrumbs = [];
    return {
       add: function(title, url) {
          breadcrumbs.push({
             title: title,
             url: url
          });
       },

       each: function (callback) {
          for (var i=0; i < breadcrumbs.length; i++) {
               callback(breadcrumbs[i].title, breadcrumbs[i].url);
          }
      }
    }
})();

IOBreadcrumb.add('title A', 'http://url.com/A');
IOBreadcrumb.add('title B', 'http://url.com/B');
IOBreadcrumb.add('title C', 'http://url.com/C');

IOBreadcrumb.each(function(title, url){
         console.log('Title', title, 'Url', url);
});