我一直在编写一个应用程序,我已经取得了很多成功,将不同的功能分解为所谓的"模块"模式,在这种模式中,你有一个自行执行的单例,包含公共和私有成员.
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模块模式的内容.我的问题是我如何使用它制作子模块,即如何从中继承子模块,比如我有这个类
var MODULE = (function () {
my = function(){
this.params = ""
},
privateVariable = 1;
my.prototype.moduleMethod = function () {
console.log("mod");
};
return my;
}());
Run Code Online (Sandbox Code Playgroud)
如何使用从父级继承的属性创建子类?我怎样才能对模块模式做同样的事情?
我可以使用下面的代码在模块模式中定义私有成员字段
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 共享私有字段的相同副本(因此它们实际上是静态的)。那么有没有办法在模块模式中定义私有字段,同时为对象使用相同的函数副本?
对于上面提到的第一种方法的继承,我首先需要在子类中创建一个对象,然后返回该对象。 …
$(document).ready().$(document).ready().$(document).ready()吗?Widget.init()查询元素吗?选项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) 我刚刚看到有人传入函数的这个问题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) 当我运行我的应用程序时,我得到:"未捕获的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) 我试图了解(显示)模块模式中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 模块模式”。据我了解,这些模块是将各种行为聚合到整洁的命名空间中的一种方法。
但是,如果我希望能够创建一个接受参数的唯一对象实例怎么办?就目前情况而言,我无法这样做,因为所有数据都是共享/静态的。我希望能够做到这一点:
var foo = new Some.Namespace.Whatever.Foo(config);
Run Code Online (Sandbox Code Playgroud)
我无法改变该模式的结构,因为我们已经使用它有一段时间了,而且效果很好。我只是想调整它,这样我就可以在其中添加一些处理非静态数据的“类”。
---编辑---由于我的无知,这实际上与所有其他 AJAX 类型的问题相同......需要进入正确的心态。为了后代的缘故,将其留在这里,也许可以帮助其他人在发布之前再次查看回调。
所以我想说,我认为这不是标准的“如何从 ajax 调用返回值”问题,人们不会等待异步调用完成。我认为这是对 Javascript 模块模式的变量范围误解,因此任何指导将不胜感激。
我正在关注这篇关于构建我的 ajax 调用的 SO 帖子,因此我在调用完成后使用延迟对象来处理我的数据。还有一些关于 Javascript 模块模式的教程,例如this和this。从外部模块内的私有模块返回值似乎相当简单——但是,我总是将 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) 我把这个取自
\n\n\n\nvar 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) 如果我声明两个具有相同名称和范围的变量会发生什么?
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代码遵循模块模式,在这里我要遵循:
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 ×12
module-pattern ×12
jquery ×2
oop ×2
ajax ×1
commonjs ×1
inheritance ×1
node.js ×1
parameters ×1
variables ×1