我想知道模块模式或Constructor/protoType模式是否更适用于我的工作.
基本上我使用的是不引人注目的javascript - HTML文档引用了.js文件.
我对模块模式的理解:
这听起来像是我情况的完美模式,因为我不需要创建对象和继承层次结构等.
我对构造函数/原型模式的理解:
我是否正确,为了提供不引人注目的javascript,模块模式是理想的?
javascript design-patterns unobtrusive-javascript module-pattern
我是ninject的完全新手
我一直在拉开其他人的代码,发现了几个nInject模块实例 - 从Ninject.Modules.Module派生的类,并且有一个包含大部分代码的加载方法.
通过调用StandardKernel实例的LoadModule方法并将其传递给模块类的实例来调用这些类.
也许我在这里遗漏了一些明显的东西,但是这对于创建一个普通的旧类并调用它的方法,或者使用静态方法的静态类有什么好处呢?
我最近在阅读" 学习JavaScript设计模式 "一书.我没有得到的是模块模式和揭示模块模式之间的区别.我觉得他们是一回事.有谁可以举个例子?
javascript design-patterns module-pattern revealing-module-pattern
无法获取以下内容以传递jslint/jshint
/*jshint strict: true */
var myModule = (function() {
"use strict";
var privVar = true,
pubVar = false;
function privFn() {
return this.test; // -> Strict violation.
}
function pubFn() {
this.test = 'public'; // -> Strict violation.
privFn.call(this); // -> Strict violation.
}
return {
pubVar: pubVar,
pubFn: pubFn
};
}());
myModule.pubFn();
Run Code Online (Sandbox Code Playgroud)
我理解它是由this函数声明中的使用引起的,但是我读过Crockford写的东西,他说违规是为了防止全局变量污染 - 但这里唯一的全局变量就是我明确定义的变量...... myModule.其他所有东西都保存在直接的功能范围内,我应该可以用它this来引用该模块.
任何想法如何让这种模式通过?
更新:如果我使用函数表达式而不是声明,这似乎工作,即
var pubFn = function () { ...
Run Code Online (Sandbox Code Playgroud)
我不是这种格式的粉丝,更喜欢将函数名称和命名参数更接近并且声明看起来/感觉更清晰.老实说,我不明白为什么这会引发违规行为 - 在这种模式中没有理由这样做.
我模仿了一个库,并能够编写以下代码.此代码创建了分配功能的'c'对象'a'.所以,要打电话'a',我将不得不写c.a().
此外,我能够为此'c'对象添加更多功能.我想了解这段代码中发生了什么.它看起来不像普通的面向对象编程.这种类型的javascript编程叫什么?
var c = (function(c) {
if (c === undefined) {
c = {};
}
function a() {
alert(1);
}
c.a = a;
return c;
}(c));
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解jQuery中使用的js模块模式.我已经编辑了几次,并试图在我的技能水平上做一个很好的练习(几个月新鲜的jquery).
这篇文章没有直接的问题.我更瞄准如何在大型网站中正确使用模块模式(与jquery一起)的反馈和输入.
更新:我添加了一些示例,以便全面了解所有编写内容的方法,并尝试覆盖任何陷阱.
/*
Not all browsers works with console.log, so we want to make sure that
console.log is defined. This defines the consol.log and send the messages
into an alert.
*/
if(!window.console) console = {
log: function(s) {
alert(s); // alert since we dont have the firebug console
}
};
// Check if namespace is defined
if (typeof (CompanyName) === 'undefined') {
CompanyName = {};
}
// Or if AppName under CompanyName...
if (typeof (CompanyName.AppName) === 'undefined') { …Run Code Online (Sandbox Code Playgroud) 我试图在javascript中绕过揭示模块模式.我对以下代码片段的两件事感到困惑.
var Child = function () {
var totalPoints = 100;
addPoints = function (points) {
totalPoints += points;
return totalPoints;
};
getPoints = function () {
return totalPoints;
};
return {
points: totalPoints,
addPoints: addPoints
};
};
$(function () {
var george = Child();
console.log(george.points);
console.log(george.addPoints(50));
console.log(george.points);
});
Run Code Online (Sandbox Code Playgroud)
这里写入控制台的三个值是100,150,100.这告诉我,当我用值调用"addPoints"时,totalPoints变量不会更新.如果我检查totalPoints的值内的addPoints功能它已经被正确地递增.这是怎么回事?
如果我使用控制台检查window.addPoints或window.getPoints,我可以看到,因为我没有在函数声明前面使用"var"它们已被添加到全局范围.这不是错的吗?我正在看的大多数例子似乎都是这样做的.
任何指针都感激不尽.
我有兴趣使用模块模式来更好地组织我未来的项目.不幸的是,只有一些简短的教程和模块模式的概念验证示例.
使用模块模式,我想将项目组织成这种结构:
project.arm.object.method();
Run Code Online (Sandbox Code Playgroud)
其中"project"是我的全局项目名称,"arm"是项目的子部分或分支,"object"是单个对象,依此类推方法和属性.
但是,我不确定如何在"项目"下宣布和组织多个"武器"和"对象".
var project = window.project || {};
project.arm = project.arm || {};
project.arm.object = (function() {
var privateVar = "Private contents.";
function privateMethod() {
alert(privateVar);
}
return {
method: privateMethod
};
}());
Run Code Online (Sandbox Code Playgroud)
定义复杂模块结构时是否有任何最佳实践或约定?我应该在最后一个下面声明一个新的手臂/物体吗?
我已经看到以下三个代码块作为JavaScript模块模式的示例.有什么区别,为什么我会选择一种模式而不是另一种?
模式1
function Person(firstName, lastName) {
var firstName = firstName;
var lastName = lastName;
this.fullName = function () {
return firstName + ' ' + lastName;
};
this.changeFirstName = function (name) {
firstName = name;
};
};
var jordan = new Person('Jordan', 'Parmer');
Run Code Online (Sandbox Code Playgroud)
模式2
function person (firstName, lastName) {
return {
fullName: function () {
return firstName + ' ' + lastName;
},
changeFirstName: function (name) {
firstName = name;
}
};
};
var jordan = person('Jordan', 'Parmer');
Run Code Online (Sandbox Code Playgroud)
模式3
var …Run Code Online (Sandbox Code Playgroud) 我以为我开始很好地理解JavaScript,但显然不是.让我用一个例子来解释我的问题.首先,我定义了以下模块:
var Test = function() {
var counter = 0;
function init() {
alert(counter);
}
return {
counter: counter,
init: init
}
};
Run Code Online (Sandbox Code Playgroud)
然后我创建了2个实例:
var test1 = new Test();
var test2 = new Test();
Run Code Online (Sandbox Code Playgroud)
现在我更新计数器变量(因为它是公共的)并做一些警报.到现在为止还挺好.
alert(test1.counter); // Alerts 0
test1.counter = 5;
alert(test2.counter); // Alerts 0
test2.counter = 10;
alert(test1.counter); // Alerts 5
Run Code Online (Sandbox Code Playgroud)
现在终于说出以下内容:
test1.init(); // Alerts 0
test2.init(); // Alerts 0
Run Code Online (Sandbox Code Playgroud)
这是我不明白的一点.为什么这个警报0?我认为第一个警报是5,第二个是10.
如果有人能解释上述内容如何起作用或指出我正确的方向,我将不胜感激.谢谢