标签: module-pattern

如何将Module-Singleton JavaScript转换为支持实例?

我一直在编写一个应用程序,我已经取得了很多成功,将不同的功能分解为所谓的"模块"模式,在这种模式中,你有一个自行执行的单例,包含公共和私有成员.

var WidgetModule = (function($, options) {

    // Private variable
    var someVar;

    // Private functions
    function somePrivateFunction() {

    }

    // Define the public members
    var self = {
        init: function() {

        },
        someFunction: function() {

        }
    };

    return self;

})(jQuery, options);
Run Code Online (Sandbox Code Playgroud)

我现在遇到一个案例,我有几个模块,我希望能够创建多个实例.

我知道这个模式是基于单例,但我想知道是否有一种无痛的方法来修改这个模式以支持创建它们的实例?

javascript oop module-pattern

3
推荐指数
1
解决办法
1640
查看次数

如何通过模块模式制作子模块

我正在阅读有关JavaScript模块模式的内容.我的问题是我如何使用它制作子模块,即如何从中继承子模块,比如我有这个类

    var MODULE = (function () { 
    my = function(){
            this.params = ""
         }, 
    privateVariable = 1; 

    my.prototype.moduleMethod = function () {
        console.log("mod");
    }; 

    return my; 
}());
Run Code Online (Sandbox Code Playgroud)

如何使用从父级继承的属性创建子类?我怎样才能对模块模式做同样的事情?

javascript design-patterns module-pattern

3
推荐指数
1
解决办法
3174
查看次数

在 JAVASCRIPT 模块模式中定义私有字段成员和继承

我可以使用下面的代码在模块模式中定义私有成员字段

    var myClass = function(){
       var private_field1,private_field_2;
       var private_func1 = function(){
            //.......
       } 
       //.........
       var myObj = {
         global_field1:2,
         global_field2:"something",
         global_func: function(){//......} 
       }
       return myObj;
    };
   var obj = myClass();
Run Code Online (Sandbox Code Playgroud)

这种方法工作得很好,但这个问题的问题在于,每当我创建一个新对象时,所有函数的副本都会被创建并加载到内存中(不像 java 中同一类的所有对象共享相同的函数内存)

我尝试使用以下其他方法:

 var myClass = (function(){
           var private_field1,private_field_2;//private static fields
           var private_func1 = function(){
                //.......
           } 
           //.........
           var Constr = function(){
             //do something
           }
           Constr.prototype = {
             //................
             global_func: function(){//......} 
           }
           return Constr;
    }());
var obj1 = new myClass();
var obj2 = new myClass();
Run Code Online (Sandbox Code Playgroud)

但是这种方法的问题是显然 obj1,obj2 共享私有字段的相同副本(因此它们实际上是静态的)。那么有没有办法在模块模式中定义私有字段,同时为对象使用相同的函数副本?

对于上面提到的第一种方法的继承,我首先需要在子类中创建一个对象,然后返回该对象。 …

javascript oop inheritance private-members module-pattern

3
推荐指数
1
解决办法
1602
查看次数

jQuery + Module Pattern:何时声明/查询元素?

  • 通常,在开始之前,您不会开始查询DOM $(document).ready().
  • 在下面的两个选项中,Widget被声明(并且元素被查询)在$(document).ready().
  • 这个可以吗?我可以初始化jQuery元素(只要我不操作任何东西),就绪处理程序的OUTSIDE?
  • 将整个Widget定义放入其中会更好$(document).ready()吗?
  • 我应该等到Widget.init()查询元素吗?
  • 注意:我是JS设计模式的新手,所以请注意我是否遗漏了一些东西

选项1

Widget = {
    ele : $('#ele'),
    init : function(){ ... }
};

$(document).ready(function(){
    Widget.init();
});
Run Code Online (Sandbox Code Playgroud)

选项2

Widget = (function(){
    var privateEle = $('#privateEle');
    return {
        publicEle: $('#publicEle'),
        init: function(){ ... }
    };
}());

$(document).ready(function(){
    Widget.init();
});
Run Code Online (Sandbox Code Playgroud)

javascript jquery document-ready module-pattern

3
推荐指数
1
解决办法
3068
查看次数

设置与自己相等的东西有什么意义?

我刚刚看到有人传入函数的这个问题window.Module = window.Module || {}.

例如:

(function(module){
    // do something with module
})(window.Module = window.Module || {});
Run Code Online (Sandbox Code Playgroud)

我理解如果window.Module未定义(或者就此而言是假的)那么{}就会被传入,但是设置中的重点是什么window.Module呢?


对于发布答案的人:

我把代码读作:

if(!(window.Module = window.Module)) {
     // pass {} into function
}
else {
     // pass window.Module = window.Module into function 
     // (which makes NO sense to me)
}
Run Code Online (Sandbox Code Playgroud)

javascript variables parameters module-pattern

3
推荐指数
1
解决办法
484
查看次数

为什么我的类在运行时未定义.Javascript模块模式

当我运行我的应用程序时,我得到:"未捕获的TypeError:无法读取未定义的属性'init'"文档reasdy函数中的警报运行,所以我知道jQuery在那时被加载.但我不知道为什么任务未定义.

这是在MVC5应用程序中,并运行jQuery 1.10.2

请帮助,jsFiddle工作正常,JsHint没有显示错误.

    var Task = (function () {

    var initialize = function () {
        console.log($);
        bindEvents();
    };
    var postFilter = function () {
        console.log("clicked");
        var postData = {
            UserID: $('#user_select').val,
            TaskTypeID: $('#taskTypeSelect').val,
            TaskStatusID: $('#status_select').val,
            PriorityID: $('#priority_select').val
        };

        $.ajax({
            url: "/Tasks/_AllTaskView",
            data: postData,
            success: function (response) {
                $('#results').html(response);
            }

        });
    };

    var bindEvents = function () {
        $('#submit_filter').on('click', postFilter);
    };

    return
    {
        init : initialize

    };

})();

$(document).ready(function () {
    alert()
    Task.init();
});
Run Code Online (Sandbox Code Playgroud)

javascript model-view-controller jquery module-pattern

3
推荐指数
1
解决办法
255
查看次数

(显示)模块模式,公共变量和返回语句

我试图了解(显示)模块模式中public属性的工作方式。卡尔·丹利Carl Danley)提出的“ 显露模块模式的优点是:

明确定义的公共方法和变量,可提高可读性

让我们看一下这段代码(fiddle):

var a = function() {
    var _private = null;
    var _public = null;
    function init() {
        _private = 'private';
        _public = 'public';
    }
    function getPrivate() {
        return _private;
    }
    return {
        _public : _public,
        init : init,
        getPrivate : getPrivate,
    }
}();

a.init();
console.log( a._public ); // null
console.log( a.getPrivate() ); // "private"
Run Code Online (Sandbox Code Playgroud)

null调用时返回a._public。我现在可以操纵该公共财产,例如a._public = 'public';。但是我不能从对象内部更改它。或至少这些更改没有通过。我有点期待它"public"是由init-method之前更新的。 …

javascript module-pattern revealing-module-pattern

3
推荐指数
2
解决办法
3093
查看次数

我可以将类与 javascript 模块模式一起使用吗?

我有一堆“模块”,它们遵循这篇流行文章中描述的“JavaScript 模块模式”。据我了解,这些模块是将各种行为聚合到整洁的命名空间中的一种方法。

但是,如果我希望能够创建一个接受参数的唯一对象实例怎么办?就目前情况而言,我无法这样做,因为所有数据都是共享/静态的。我希望能够做到这一点:

var foo = new Some.Namespace.Whatever.Foo(config);
Run Code Online (Sandbox Code Playgroud)

我无法改变该模式的结构,因为我们已经使用它有一段时间了,而且效果很好。我只是想调整它,这样我就可以在其中添加一些处理非静态数据的“类”。

javascript module-pattern

2
推荐指数
1
解决办法
5846
查看次数

ajax 调用后从 Javascript 模块返回值

---编辑---由于我的无知,这实际上与所有其他 AJAX 类型的问题相同......需要进入正确的心态。为了后代的缘故,将其留在这里,也许可以帮助其他人在发布之前再次查看回调。

所以我想说,我认为这不是标准的“如何从 ajax 调用返回值”问题,人们不会等待异步调用完成。我认为这是对 Javascript 模块模式的变量范围误解,因此任何指导将不胜感激。

我正在关注这篇关于构建我的 ajax 调用的 SO 帖子,因此我在调用完成后使用延迟对象来处理我的数据。还有一些关于 Javascript 模块模式的教程,例如thisthis。从外部模块内的私有模块返回值似乎相当简单——但是,我总是将 myObj.roots() 视为未定义。即使当我检查断点时它被定义为 X 值的数组。我错过了什么简单的事情——有什么提示吗?谢谢!抱歉,我问了一个简单的问题,我对 JS 模块模式完全陌生,并试图构建自己的库......

我的JS代码:

var myObj = (function(window,document,$,undefined){

  var _baseUri = 'http://example.com/',
      _serviceUri = 'services/',
      _bankId = '1234',
      _myUri = _baseUri + _serviceUri + 'objectivebanks/' + _bankId,
      _roots = [];

  function myAjax(requestURL) {
    return $.ajax({
      type: 'GET',
      url: requestURL,
      dataType: 'json',
      async: true
    });
  }

  var getRoots = function() {
    var _url …
Run Code Online (Sandbox Code Playgroud)

javascript ajax module-pattern revealing-module-pattern

2
推荐指数
1
解决办法
1668
查看次数

CommonJS 模块模式

我把这个取自

\n\n

通量架构

\n\n
var AppDispatcher = require(\'../dispatcher/AppDispatcher\');\nvar EventEmitter = require(\'events\').EventEmitter;\nvar TodoConstants = require(\'../constants/TodoConstants\');\nvar assign = require(\'object-assign\');\n\nvar CHANGE_EVENT = \'change\';\n\nvar _todos = {}; // collection of todo items\n\n/**\n * Create a TODO item.\n * @param {string} text The content of the TODO\n */\nfunction create(text) {\n  // Using the current timestamp in place of a real id.\n  var id = Date.now();\n  _todos[id] = {\n    id: id,\n    complete: false,\n    text: text\n  };\n}\n\n/**\n * Delete a TODO item.\n * @param {string} id\n */\nfunction …
Run Code Online (Sandbox Code Playgroud)

javascript module-pattern commonjs node.js

2
推荐指数
1
解决办法
2936
查看次数

在JavaScript中声明两个具有相同名称和范围的变量时会发生什么?

如果我声明两个具有相同名称和范围的变量会发生什么?

var foo = (function() {
    return {
        alertMe: function() {
            alert("foo1");
        }
    }
})();

var foo = (function() {
    return {
        alertMe: function() {
            alert("foo2");
        }
    }
})();

foo.alertMe();
Run Code Online (Sandbox Code Playgroud)

我问,因为我在我的网站上动态加载小portlet,每个portlet都有自己的脚本标记和JavaScript模块.问题是,用户可以复制portlet,这意味着很可能会出现类似上述情况.

javascript module-pattern

1
推荐指数
1
解决办法
2821
查看次数

JavaScript的模块模式不是功能吗?

我试图使我的javascript代码遵循模块模式,在这里我要遵循:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

这是我目前的代码,除了运行时调用外,没有语法问题

Pinetime.init()不是函数。

var loosetime = (function () {
    var looseconfig = {
        "format": "DD/MM/YY HH24:MM:SS.s",
        "value": "DD/MM/YY 00:00.00",
        "class": "input",
        "delims": ['/', '-', '_', '.', '|', ',', ' ', ':']
    };

    function loosetime(a, b, c, d, e) {
        var format = a;
        var appendLoc = b;
        var inputVal = c;
        var inputName = d;
        var inputClass = e;
        var inputLength;

        try {
            if (typeof(format) == 'undefined') {
                format = looseconfig.format;
            } else {
                format = parseDateTime(format);
            }

            try …
Run Code Online (Sandbox Code Playgroud)

javascript module-pattern

0
推荐指数
1
解决办法
895
查看次数