【问题标题】:Most elegant way to define private "class" functions in Spine在 Spine 中定义私有“类”函数的最优雅方式
【发布时间】:2011-10-23 22:05:54
【问题描述】:

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

var PrinterManager = Spine.Class.create({

    init: function () {

    },

    getAllAvailablePrinters: function () {

    },

    printDocument: function () {

    }

});

(function () {

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

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

})();

如您所见,我希望 instantiateActiveX 是私密的,不对外可见。使用 JavaScript 闭包函数技巧,我可以毫无问题地将其设为私有,但在像 Spine 那样创建类的竞赛中,这种解决方案对我来说似乎不太优雅。

代码有效,即我可以调用 PrinterManager.init().pubInitActiveXPrinter(),然后它会在内部调用私有函数,并且 - 正确 - 我不能调用 PrinterManager.init().instantiateActiveX()

我的问题 - 有没有更优雅的方式来处理我尚未发现的 Spine??

【问题讨论】:

    标签: javascript spine.js


    【解决方案1】:

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

    【讨论】:

    • 当然,您需要在 JavaScript 中使用闭包来“模拟”私有范围。这是明确的和给定的。我的反对意见更多是关于 Spine,因为作者似乎依赖于一种纯粹的传统机制,这可能很好,但不如模拟私有作用域那么“安全”。虽然上述机制完美运行,因为“instantiateActiveX()”不是“public”,但集成起来相当麻烦......
    • 所以我们很清楚,除了使用闭包之外,没有其他方法可以将某些东西声明为私有,而这是您问题的唯一答案。当然,有十几种方法可以在另一个函数中声明一个函数,但它更多的是标记问题,而不是功能的实际更改。对一个人来说优雅的东西,对其他人来说并不一定是优雅的。
    【解决方案2】:

    没有。

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

    您应该问的真正问题是“为什么需要私有函数”,因为您不需要。

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

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

    如果有人使用这些内部函数或变量,那么当他们的代码在你更改时发生错误时,他们无权抱怨。

    【讨论】:

    • 在函数前加下划线只是一种约定,不会阻止任何人在全局范围内使用它。在某些情况下,完全私有的函数是有意义的——在其他语言中有私有/受保护的修饰符是有原因的。
    • @WTK 为什么?为什么需要私有函数。
    • 在全局范围内隐藏您的代码并仅提供修改对象状态的公共 入口 点。
    • @WTK "hide from global scope" 那么它已经在一个对象中,所以它不在全局范围内。并且在函数前面加上_ 声明它们是内部的,应该自担风险使用。我没有看到 private 除了握住你的手并让编译器在你做坏事时拍你的手腕之外添加任何东西
    • 好吧,除了已经说过的内容之外,私有不会添加任何内容 - 它隐藏了您的函数或变量。它是封装——面向对象编程的原则——别告诉我你看不到它的用途......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2011-06-05
    • 2012-06-12
    • 2020-01-28
    • 2010-10-12
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多