2012-10-17 54 views
1

我正在为HTML5文件(读取器)API构建一个包装,使其回退到正常的文件输入或swfupload。防止函数被直接调用

我有一个通用功能“上传”和三个子功能(所有在同一范围内)

function Uploader() { } 

function UploaderAPI() { } 

function UploaderSWF() { } 

function UploaderHTML() { } 

的想法是,你创建一个var uploader = new Uploader()和函数调用子功能之一,基于特征支持/配置。

但是,我想知道是否有一种方法可以防止用户直接调用其中一个子函数,而只能将它们仅用于Uploader()。

这是可行的,而无需将它们移动到上传器范围?

+0

你的函数内部的普通瓦尔是私有的。 –

+0

“这是可行的,而无需将它们移动到上传器范围?” - no - 使这些函数仅对Uploader可见的唯一方法是将它们移动到Uploader范围中,如下面的答案所做的那样,这是范围的定义。 –

+0

@JamesGaunt - 是的,这是可能的。看看我的答案。我没有把它移到'Uploader'范围。我把所有的函数都转换成了[IIFE](http://benalman.com/news/2010/11/immediately-invoked-function-expression/“Ben Alman » Immediately-Invoked Function Expression(IIFE)”),它返回'上传器'功能。 –

回答

4

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

例如

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/

+0

你的代码是错误的。在你的情况下,上传器是一个“对象”,而不是“函数”。 –

+0

另外,您无法从“上传器”实例调用'publicMethodAPI'。它没有在'Uploader.prototype'上定义。 –

+2

@AaditMShah我的代码工作正常,没有错。尝试到你的JavaScript控制台(如果你看到一些警报,请考虑删除你的downvote) – fcalderan