javascript - IIFE 创建模式 - 但如何支持构造函数参数?

标签 javascript

作为一名长期的经典继承 OO 程序员,我对使用构造函数和创建接受所需参数作为构造函数参数的对象感到非常自在。例如,发送与订单相关的警报的对象可能如下所示:

var orderNotifier = function(orderId, notifier, recipients)
{
    this.notifyApproved = function()
    { 
        // use the notifier object passed as ctor param to send notifications 
        // related to orderId to recipients 
    }
    this.notifySomeOtherEvent = function() { // use the ctor params again }
}

//  then use it like
var on = new orderNotifier(12345, new BasicNotifier(), someArrayOfEmails);
on.notifyApproved();

所以这是一个人为的例子,但举例说明了(恕我直言)参数化构造函数的值。具体来说:

  1. 在单个语句中将状态传递给对象
  2. 简化方法签名
  3. 内部状态是隐藏的

认识到 JavaScript 中的构造函数创建模式不能很好地支持信息隐藏,我被 Immediately Invoked Function Expressions 吸引了。 (IIFE) 模式及其闭包和更强的访问控制。现在我遇到了这样一个事实,即我无法使用 IIFE 模式传递对象构造参数,或者至少我不明白我该怎么做。

我知道您可以像这样将参数传递给匿名函数:

(function(param){})(someVar);

但这与显式创建新对象并将参数传递给构造函数不同。就 IIFE 模式的本质而言,我不一定要将数据传递给对象。

我上面的 IIFE 版本想要:

var orderNotifier = (function()
{
    var privateHelperMethod = function() { return 'blahblahblah'; };

    return {
        notifyApproved: function(orderId, notifier, recipient)
        { 
            // use the notifier object passed as ctor param to send notifications 
            // related to orderId to recipients
            var msg = privateHelperMethod() 
        },

        notifySomeOtherEvent: function(orderId, notifier, recipient)
        {
            // use the ctor params again
            var msg = privateHelperMethod();
        }
    };
}}();

所以我必须问经验丰富、进步的 JavaScript 专业人士:使用标准的 ECMAScript 5 语言功能,使用 IIFE 模式创建对象并在单个操作中提供对象状态的最佳实践(或者甚至可能只是常见实践)是什么? (除了公开 setState() 或类似方法。)换句话说:我怎样才能既吃蛋糕又吃蛋糕?

最佳答案

您的 IIFE 构造函数模式创建了一个单例(永远只有一个对象)。它不公开构造函数,因此不能用于创建更多对象。因此,您可以通过 IIFE 的参数将任何您想要的信息传递到单例中,或者直接将这些参数编码到实现中。

这就是为什么我希望您向我们展示您实际上在谈论什么设计模式,因为这种特定模式不是通用构造函数,也不是为创建多个对象而设计的。它创建一个单例对象。这就是它的最佳用途。如果返回的对象公开了可以用作构造函数的函数,那么它们就可以像其他构造函数一样接受参数。

我看不出有什么问题。我看不出有什么问题需要解决。

根据你的评论,如果你想将非静态数据传递到 IIFE,那么你要么必须在创建非静态数据之后找到 IIFE(以便在 IIFE 运行之前数据可用),选择不同的设计模式(例如使用传统的构造函数)或使用创建构造函数(您可以稍后调用)而不是对象的 IIFE。


例如,这是一个创建构造函数的 IIFE:

var OrderNotifier = (function()
{
    //  private stuff would go here
    //  shared by all instances


    return function(/* constructor args go here */) {

        // per-instance private vars here

        return {
            notifyApproved: function(orderId, notifier, recipient)
            { 
                // use the notifier object passed as ctor param to send notifications 
                // related to orderId to recipients 
            },

            notifySomeOtherEvent: function(orderId, notifier, recipient)
            {
                // use the ctor params again
            }
        };
    }

}}();

// sometime later in your code
var notifier = new OrderNotifier(/* args here */);

关于javascript - IIFE 创建模式 - 但如何支持构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26497720/

相关文章:

javascript - appendTo 添加多个对象

javascript - 回调中的 setTimeout() 不起作用,为什么?

javascript - AWS S3 JavaScript 浏览器上传无需访问 key

javascript - Fancybox 不考虑滚动条宽度

javascript - 使用 Angular 4 创建将获取 URL 值的输入字段时出现错误

javascript - Reshape String,每N个字符插入 "\n"

php - 基于PHP调用JavaScript函数,PHP in JavaScript

javascript - 语法错误 : Unexpected identifier with imported module Node. js

javascript - 我的 anchor 标记不断打开服务器上的链接

javascript - userServic不会将数据传递到后端: Cannot read property 'protocol' of undefined - AngularJS