JavaScript 模块模式 - 使用 "return this"怎么样?

标签 javascript design-patterns module-pattern

在阅读了一些有关模块模式的内容后,我看到了几种返回您想要公开的属性的方法。

除了私有(private)属性和方法之外,最常见的方法之一是在“return”语句中声明您的公共(public)属性和方法。一种类似的方式(“揭示”模式)是提供对您希望公开的属性和方法的简单引用。最后,我看到的第三种技术是在模块函数内创建一个新对象,在返回所述对象之前将新属性分配给该对象。这是一个有趣的想法,但需要创建一个新对象。

所以我在想,为什么不直接使用this.propertyName来分配你的公共(public)属性和方法,最后使用return this呢?这种方式对我来说似乎更简单,因为您可以使用通常的 varfunction 语法创建私有(private)属性和方法,或者使用 this.propertyName 声明公共(public)方法的语法。

这是我建议的方法:

(function() {

var privateMethod = function () {
    alert('This is a private method.');
}

this.publicMethod = function () {
    alert('This is a public method.');
}

return this;

})();

使用上述方法有什么优点/缺点吗?其他人呢?

最佳答案

您的函数没有对象上下文,因此在这种情况下 this 引用全局 window 对象。您分配给 this 的每个属性都会自动污染全局命名空间。

(function() {
    console.log(this == window); // true

    this.publicMethod = function () {
        alert('This is a public method.');
    }

})();

console.log(publicMethod); // function()

你可以显式地传递一个对象来告诉它使用哪个上下文。

var MYAPP = {};

(function() {
    // 'this' will now refer to 'MYAPP'
    this.publicMethod = function () {
        alert('This is a public method.');
    }
}).call(MYAPP);

console.log(publicMethod); // undefined
console.log(MYAPP.publichMethod); // function()

你可以用其他风格来写:

var MYAPP = (function(my) {
    var my;
    ⋮
    return my;
})(MYAPP);

我们到达了an already discussed pattern .有关详细信息,请参阅 Dustin 关于 Scoping anonymous functions 的文章.

关于JavaScript 模块模式 - 使用 "return this"怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713431/

相关文章:

javascript - 使用 window.onunload 调用时,AJAX 调用在 IE8 及更低版本中中止

javascript - express .js : How to get actual image file to check magic bytes in Multer?

javascript - Suitescript 计划脚本错误 : SSS_MISSING_REQD_ARGUMENT Details: id

c++ - 多渲染 API 引擎着色器文件管理

java - 实现依赖注入(inject)设计模式

design-patterns - 为什么使用单例而不是静态类?

javascript - 在模块模式中设置和获取私有(private)变量

javascript - 使用模块模式的变体发出附加 javascript 事件的问题

javascript - Angularjs debounce 正在清除我的 radio 输入

javascript - 包装库部分的代码构造是什么,它有什么用?