Ste*_*tef 15 javascript design-patterns
我已经阅读了很多关于模块模式的内容.好吧它带来了结构,私有方法等......但是使用下面的代码我可以在不使用它的情况下获得相同的行为.
function Human()
{
// private properties
var _name='';
var _age=0;
// private methods
function created()
{
console.log("Human "+_name+" called");
};
// public
this.setName = function(name){
_name=name;
created();
};
}
var h1 = new Human();
h1.setName("John");
Run Code Online (Sandbox Code Playgroud)
那么,最终模块模式的真正优势是什么?
use*_*064 11
我认为这个例子可以帮助你澄清模块模式的用处.
模块模式被广泛使用,因为它提供了结构并有助于在代码增长时组织代码.与其他语言不同,JavaScript没有特殊的包语法,但模块模式提供了创建自包含的解耦代码片段的工具,可以将其视为黑盒功能,并根据以下内容添加,替换或删除. (不断变化的)您正在撰写的软件的要求.
模块模式是几种模式的组合,即:
第一步是设置命名空间.让我们使用本章前面的namespace()函数,并启动一个提供有用数组方法的示例实用程序模块:
MYAPP.namespace('MYAPP.utilities.array');
Run Code Online (Sandbox Code Playgroud)
下一步是定义模块.该模式使用立即函数,如果需要隐私,将提供私有范围.immediate函数返回一个对象 - 具有公共接口的实际模块,该模块的使用者可以使用该模块:
MYAPP.utilities.array = (function () {
return {
// todo...
};
}());
Run Code Online (Sandbox Code Playgroud)
接下来,让我们为公共接口添加一些方法:
MYAPP.utilities.array = (function () {
return {
inArray: function (needle, haystack) {
// ...
},
isArray: function (a) {
// ...
}
};
}());
Run Code Online (Sandbox Code Playgroud)
使用immediate函数提供的私有作用域,您可以根据需要声明一些私有属性和方法.在立即函数的顶部也将是声明模块可能具有的任何依赖项的地方.在变量声明之后,您可以选择放置任何有助于设置模块的一次性初始化代码.最终结果是包含模块的公共API的immediate函数返回的对象:
MYAPP.namespace('MYAPP.utilities.array');
MYAPP.utilities.array = (function () {
// dependencies
var uobj = MYAPP.utilities.object,
ulang = MYAPP.utilities.lang,
// private properties
array_string = "[object Array]",
ops = Object.prototype.toString;
// private methods
// ...
// end var
// optionally one-time init procedures
// ...
// public API
return {
inArray: function (needle, haystack) {
for (var i = 0, max = haystack.length; i < max; i += 1) {
if (haystack[i] === needle) {
return true;
}
}
},
isArray: function (a) {
return ops.call(a) === array_string;
}
// ... more methods and properties
};
}());
Run Code Online (Sandbox Code Playgroud)
模块模式是一种广泛使用且强烈推荐的组织代码的方法,特别是随着代码的增长.
"JavaScript模式,Stoyan Stefanov(O'Reilly).版权所有2010 Yahoo!,Inc.,9780596806750
不知道为什么没人能正确回答这个问题.我可以看到在某种模式中使用自动调用函数的潜力,这些模式旨在使私有变量可以继承,但你绝对正确.
使用模块模式代替核心语言函数构造函数没有任何好处.它是完全相同的语言机制(闭包),允许持久内部变量作为不可访问的实体存在,只有更多的代码.
在JS中,函数构造函数遵循与触发函数相同的范围规则.范围和结束是在定义点设定的.函数构造函数的内部var所依赖的原因是因为具有在引用该var的同一构造函数内定义的方法的实例存在.
唯一改变的是你已经在构造函数中消除了原型方法的使用,并且必须为继承的方法进行jury-rig自己的继承机制.