Sea*_*ean 5 javascript namespaces object
我的命名空间是使用立即调用的函数表达式(IIFE)编写的.我的基本结构如下:
(function ($, MyObjectName, undefined) {
"use strict";
MyObjectName.publicFunction = function () {
privateFunction();
};
var privateFunction = function () {
document.write('hello');
};
}(jQuery, window.MyObjectName = window.MyObjectName || {}));
Run Code Online (Sandbox Code Playgroud)
//调用公共方法
MyObjectName.publicFunction();
Run Code Online (Sandbox Code Playgroud)
现在我想用另一个可公开访问的对象扩展这个命名空间.从这里开始,我正在我当前的命名空间中执行另一个IIFE.见下文.
(function ($, MyObjectName, undefined) {
"use strict";
var ExtendedObject = (function ($, ExtendedObject, undefined) {
"use strict";
ExtendedObject.publicFunction = function () {
privateFunction();
};
var privateFunction = function () {
document.write('<br>hello again');
};
}(jQuery, window.MyObjectName.ExtendedObject = window.MyObjectName.ExtendedObject || {}));
}(jQuery, window.MyObjectName = window.MyObjectName || {}));
Run Code Online (Sandbox Code Playgroud)
//从扩展名称空间调用公共方法
MyObjectName.ExtendedObject.publicFunction();
Run Code Online (Sandbox Code Playgroud)
这是"正确"的做法吗?如果没有,我怎么能实现这个目标?
IIFE 用于包含变量的范围。在调用期间传入依赖项只是为了简洁,因为函数体实际上确实会看到它们。它有助于保持代码整洁,并且是一种可识别的模式。
然而,一旦进入 IIFE,除了通过参数名称之外,您应该停止引用外部依赖项。否则,整洁的努力就白费了。
因此,当使用此模式构建嵌套名称空间/对象时,您不需要重复整个模式。
相反,只需将您分配给ExtendedObject并MyObjectName重新使用外部 IIFE 中的任何参数(例如 $)。
(function ($, MyObjectName, undefined) {
"use strict";
MyObjectName.ExtendedObject = (function () {
"use strict";
var exports = {};
exports.publicFunction = function () {
privateFunction();
};
var privateFunction = function () {
document.write('<br>hello again');
};
return exports;
}());
}(jQuery, window.MyObjectName = window.MyObjectName || {}));
Run Code Online (Sandbox Code Playgroud)
因为您仍然希望在 ExtendedObject 上拥有私有和公共方法,所以我仍在使用 IIFE,但已将其转换为使用揭示模块模式的变体,从而构建导出(公共)功能的对象并返回该对象 - 与此相反有选择地将公共方法附加到传入的对象。我的“变体”是使用导出变量,这使得您在阅读代码时更清楚哪些方法将是公共的,并避免最后容易出错的重复这些成员名称。
如果您希望在 ExtendedObject 中使用 JQuery 或 MyObjectName 的任何功能,那么您可以这样做,但不要在 MyObjectName 前加上前缀,window.因为这会重新引入您已经竭尽全力避免的依赖关系!
不遗余力地保护会员隐私已经过时了。官方的JavaScript 类语法没有提供它们,并且在构造函数中自己构建它们看起来显然很笨拙。
您似乎热衷于遵循最佳实践并保持代码整洁和对象暴露区域有意义。这是为了限制最终用户手中的代码的可破解性还是为了确保它在设计时不会被误用?如果是后者,那么我建议您看一下 TypeScript,因为它允许您像 JS 是强类型并且具有私有成员一样进行编码。然而,它会转换为普通 JS,所有内容都是公开的,因此,如果您打算将隐私扩展到最终用户,那么它不是一个理想的解决方案。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |