使用模块模式和实例化新对象之间的区别
Difference between using a module pattern and instantiating new objects
我正在尝试重构一些javascript,但我对模块模式感到困惑。
我现在的一种方法是简单地声明一个类,该类包含像这样的组件的所有功能
var Foo = function(){
this.Bar = {};
...
}
并创建一个新实例以在组件中使用。但我也读过关于模块模式的文章,我看不出与我所拥有的相比会有什么好处,因为它似乎是以一种更复杂的方式来做的。也许我只是没有遇到让它成为更好选择的情况。例如,像这样的模式:
var module = (function () {
// private variables and functions
var foo = 'bar';
// constructor
var module = function () {
};
// prototype
module.prototype = {
constructor: module,
something: function () {
}
};
// return module
return module;
})();
var my_module = new module();
看起来与我已经拥有的没有太大区别。这种模式能让我做什么,而我不能用另一种方式做什么?
两者之间的关键区别在于,在第一个示例中,如果您想使用原型,就不能使用私有变量和函数。您可以拥有私有变量和函数,但前提是您的公共属性和方法是通过将它们附加到this
而在构造函数中创建的。
带有私有变量和函数的示例1:
var Foo = function(){
var privateVar = "priv";
function privateFunction(){
console.log(privateVar);
}
this.publicProperty = 1;
this.publicFunction = function(){
console.log(privateVar);
}
}
如果你不想使用原型,以上内容是没有问题的。然而,如果您这样做了,那么如果没有第二个示例所受益的新范围,就无法拥有私有变量。
正如您所看到的,您必须在构造函数中包含所有内容,而在第二个示例中,您可以将构造函数留给初始化变量。
相反,第二个例子中的原型方法超出了构造函数的范围,因此它们不能在构造函数中使用函数的任何变量。原型方法需要的所有函数和变量都必须在外部闭包范围中声明。
相关文章:
- JavaScript中的函数和对象之间没有区别吗?
- 在控制器和数据对象之间同步数据
- 不同对象之间的递归,并将它们唯一地组合在一起,不重复
- 两个对象之间的Javascript原型
- 在window.onload之前/之后创建对象之间的区别
- 如何管理原始对象之间的数据依赖关系
- javascript中构造函数和对象之间的等价性
- 为什么 JSON 中的对象之间有逗号
- 对字符串对象调用 .localeCompare 与构造特制的 Intl.Collator 对象之间的性能差异
- 如何匹配两个对象之间的值并使用特定值创建新对象
- D3 - 在两个不与其他对象相交的对象之间绘制一条线
- 两个时间对象之间的差异
- 函数和对象之间的差异,以及它如何影响性能
- jQuery函数,用于计算两个JavaScript对象之间的差异
- jQuery 自定义事件在全局范围内工作,但在对象之间不起作用
- 以天为单位的 2 个 ember 日期时间对象之间的差异
- 使用原型和对象文字表示法创建对象之间的区别
- HTML/JS Canvas 在对象之间画线
- 在 jQuery 对象和纯 js 对象之间进行转换
- 循环遍历 JSON,在对象之间插入键/值