2011-08-10 26 views
3

我目前正在潜入Spine中,目前我正在问自己,使用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()

我的问题 - 有没有更优雅的方式来处理脊柱,我还没有发现?

回答

0

好吧,简单来说,除了闭包之外,无法在全局范围内创建一些函数/变量不可见/私有。

+0

当然,您需要在JavaScript中使用闭包来“模拟”私有范围。这很清楚并给出。我的反对意见更多的是关于脊柱的问题,因为笔者似乎依赖纯粹的传统机制,这可能很好,但并不像模仿私人范围那样“安全”。虽然上面的机制完全可以像“instantiateActiveX()”不是“public”一样工作,但是集成起来非常麻烦...... – Juri

+0

所以我们清楚地知道,除了使用闭包之外,没有办法声明私有事物,并且是你的问题的唯一答案。当然,有十几种方法可以在另一个中声明一个函数,但它的标记比实际的功能更改更重要。看起来优雅*对一个人来说,对别人来说不一定是优雅的。 – WTK

0

编号

“私人”功能不存在。您只有本地功能和关闭状态。并且使用局部函数/变量和闭包来处理状态并不能很好地与使用原型继承进行混合。

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

如果一个函数是不稳定的,不应该被使用,因为API可能会改变只是_

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

预置它如果有人使用这些内部函数或变量,然后他们有没有权当抱怨如果您更改它们,代码会中断。

+2

用下划线前置函数只是一个约定,并不会阻止任何人在全局范围内使用它。在tottaly私有函数有意义的情况下 - 有其他语言中存在私有/受保护修饰符的原因。 – WTK

+0

@WTK为什么?为什么你需要私人功能。 – Raynos

+0

要将代码隐藏在全局范围内,并只提供修改对象状态的公共* *条目*点。 – WTK