Javascript 定义“私人”的最优雅方式;“类”;脊柱功能

Javascript 定义“私人”的最优雅方式;“类”;脊柱功能,javascript,spine.js,Javascript,Spine.js,我现在正在深入研究Spine,我正在问自己,使用Spine的类创建方法定义私有函数的最优雅的方式是什么 var PrinterManager = Spine.Class.create({ init: function () { }, getAllAvailablePrinters: function () { }, printDocument: function () { } }); (function () { var

我现在正在深入研究Spine,我正在问自己,使用Spine的类创建方法定义私有函数的最优雅的方式是什么

var PrinterManager = Spine.Class.create({

    init: function () {

    },

    getAllAvailablePrinters: function () {

    },

    printDocument: function () {

    }

});

(function () {

    var instantiateActiveX = function(){
        console.log("...");
    }

    PrinterManager.include({
        pubInitActiveXPrinter: function(){
            instantiateActiveX();
        }
    });

})();
正如您所看到的,我希望实例化的Activex是私有的,外部看不到。使用JavaScript闭包函数技巧,我可以将其私有化,而不会有任何问题,但是在创建像Spine这样的类的竞赛中,这个解决方案对我来说似乎并不太优雅

代码可以工作,也就是说,我可以调用
PrinterManager.init().pubinitiactivexprinter()
,然后在内部调用私有函数,正确地说,我不能调用
PrinterManager.init().instantiateActiveX()


我的问题-有没有一种更优雅的方法来处理我还没有发现的Spine???

简单地说,除了闭包,没有其他方法可以使某些函数/变量在全局范围内不可见/私有。

没有

“私有”功能不存在。您只有本地函数和闭包状态。对于状态使用局部函数/变量和闭包与使用原型继承并不能很好地结合

你应该问的真正问题是“为什么你需要私人功能”,因为你不需要

如果函数不稳定且不应使用,因为API可能会更改,则只需在其前面加上
\uuuu

var PrinterManager = {
   ...
   _instantiateActiveX: function() { 
       ...
   }
}

如果任何人使用这些内部函数或变量,那么当您更改它们的代码时,它们无权抱怨代码是否中断。

在函数前面加下划线只是一种惯例,不会阻止任何人从全局范围使用它。在某些情况下,tottaly私有函数是有意义的-在其他语言中存在私有/受保护修饰符是有原因的。@WTK为什么?为什么需要私有函数。要在全局范围内隐藏代码,只提供修改对象状态的公共入口点。@WTK“隐藏全局范围”它已经在对象中,所以不在全局范围内。在函数前面加上
表示它们是内部函数,使用时应自行承担风险。除了握住你的手,让编译器拍打你的手腕之外,我看不到任何
private
添加的内容。如果你做了一些事情,badWell private没有添加任何内容,除了已经说过的内容,它隐藏了你的函数或变量。它是封装——面向对象编程的一个原则——不要告诉我你看不到它的用途……当然,你需要JavaScript中的闭包来“模拟”私有范围。这是明确的。我的反对意见更多的是关于Spine,因为作者似乎依赖于一种纯粹的传统机制,这可能很好,但不像模拟私有范围那样“安全”。虽然上面的机制工作得很好,因为“instanceATIVEX()”不是“public”,但是集成起来相当麻烦……因此我们很清楚,除了使用闭包之外,没有其他方法可以将某些东西声明为私有的,这是您的问题的唯一答案。当然,有十几种方法可以在一个函数中声明另一个函数,但这更多的是标记问题,而不是功能的实际更改。在一个人看来优雅的东西,在别人看来未必优雅。