【问题标题】:Prevent function from being called directly防止函数被直接调用
【发布时间】:2012-10-17 07:36:38
【问题描述】:

我正在为 HTML5 文件(阅读器)API 构建一个包装器,并回退到正常的文件输入或 swfupload。

我有一个通用函数“上传者”和三个子函数(都在同一范围内)

function Uploader() { }

function UploaderAPI() { }

function UploaderSWF() { }

function UploaderHTML() { }

这个想法是您创建一个var uploader = new Uploader(),并且该函数会根据功能支持/配置调用其中一个子函数。

但是,我想知道是否有办法阻止用户直接调用其中一个子函数,而是让它们仅对 Uploader() 可用。

在不将它们移动到 Uploader 范围的情况下是否可行?

【问题讨论】:

  • @Aadit - 是的,你有 - 你可能会调用 Uploader 一些不同的东西,但本质上你正在将私有函数移动到公共函数中,公共函数是 Uploader。您可以将其包装在其他东西中并更改名称,但它是相同的解决方案。
  • @Aadit - 我明白你做了什么,但你仍然创建了一个函数并将你的私有函数放入其中。只有该函数中的代码才能访问私有函数。然后,您通过将此代码放入另一个私有函数以创建闭包并返回 this,从而不必要地增加了一些额外的复杂性,但这只是将代码更深入地移动到原始 Uploader 范围内。
  • @Aadit - 我并不是说你的代码不好 - 这可能是我会做的。我只是说它确实将私有函数移动到了最初被认为是 Uploader 范围内。复杂性是“不必要的”,因为它不会改变这一事实。归根结底,如果您的论点是这些函数不在 Uploader 的范围内,也不在更“全局”的范围内,那么 Uploader 是如何调用它们的呢? “原始上传器范围”是指原始全局函数 - 这是 OP 在询问原始问题时所指的范围。
  • 好的 - 问题是关于范围,而不是性能。您可以通过在公共函数中内联私有函数来使其更快。但这与问题无关。
  • 您只是选择将 Uploader 称为其他名称。这是语义。问题中的 Uploader 是全局函数,您的私有函数在此范围内。您可以轻松地将 Uploader 重命名为 Downloader,然后这些功能不再在 Uploader 范围内。无论如何 - 很高兴在这一点上不同意。

标签: javascript oop unobtrusive-javascript


【解决方案1】:

您可以使用 module pattern 并将这些函数定义为 private 方法(通过闭包),但这会将您的函数移动到另一个范围内。

例如

var Uploader = function() {

   var UploaderAPI = function() { alert('uploaderAPI'); };

   var UploaderSWF = function() { alert('uploaderSWF');  };

   var UploaderHTML = function() {  alert('uploaderHTML'); };

   return {

      /* expose public methods here */

      publicMethodAPI : function() {
          alert('public uploaderAPI');
          UploaderAPI();
      }
   };
};

这样做,您可以选择使一些公共方法与实例一起可用,并在其中使用这些函数,但不直接调用它们,例如

var myupl = new Uploader();
myupl.publicMethodAPI();

示例(工作)小提琴:http://jsfiddle.net/ndQFB/

【讨论】:

  • 您的代码错误。 Uploader 在您的情况下是 object,而不是 function
  • 另外,您将无法从Uploader 的实例调用publicMethodAPI。它没有在 Uploader.prototype 上定义。
  • @AaditMShah 我的代码工作正常,没有错。在您的 javascript 控制台中尝试(如果您看到一些警报,请考虑删除您的反对票)
  • 我的错误。但是,我不会删除我的反对票。 OP 想要使用 Uploader 作为构造函数。通过返回一个对象,您实际上是在破坏他的代码。另外,您所描述的不是模块模式。在模块模式中,您立即调用函数表达式。这就是让我困惑的地方。查看您自己的链接。
  • 是的,但我宁愿创建一个公共函数setCallback(name, function),您可以在其中重新定义特定的回调,而不是污染对构造函数的调用
猜你喜欢
  • 2019-03-03
  • 2017-08-10
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2017-12-06
  • 2023-02-16
相关资源
最近更新 更多