使用CoffeeScript在"公共函数"类中获取"私有方法"

Cai*_*ifa 4 javascript class private-methods coffeescript public-method

我正在使用类和CoffeeScript/JavaScript进行一系列测试.请参阅以下代码:

class Example

    someFunction = ->
        alert @getText()

    constructor: ->
        @text = 'Hello world! ;)'
        someFunction()

    getText: ->
        @text


### Instance ###
example = new Example
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,编译时我得到错误:

Uncaught TypeError: Object [object global] has no method 'getText'
Run Code Online (Sandbox Code Playgroud)

你知道我怎么能解决这个问题吗? http://jsfiddle.net/P4Xdz/

mu *_*ort 6

如果你真的想做这种事情,你必须手动提供正确的@(AKA this)callapply:

constructor: ->
    @text = 'Hello world! ;)'
    someFunction.call(@)
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/6KZrs/

问题是,这someFunction不是任何一种方法,它只是一个简单的功能.如果你需要它表现得像一个方法,那么你必须通过@在调用时提供所需的方法来"手动化" 它.这(和流行病)建议了另一种方法:明确地将对象作为参数传递:

someFunction = (ex) ->
    console.log ex.getText()

constructor: ->
    @text = 'Hello world! ;)'
    someFunction(@)
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/hccDr/

请记住,JavaScript中没有公共或私有,因此CoffeeScript中没有公共或私有.您可以排序的假,但造假有洞,而且往往需要更多的欺骗(如手动供应@call),使其工作.如果您查看代码的JavaScript版本,您会看到这someFunction就是:

var someFunction = function() { ... };
Run Code Online (Sandbox Code Playgroud)

只是一个作用于类函数的变量中的函数,仅此而已.还要记住,因为它someFunctionExample类函数的本地函数,所以它不会以任何方式显示为子类.

  • 或者,你可以使你的闭包可见函数(又名"私有")接受一个参数而不是在其中使用`this`:`someFunction =(ex) - > alert ex.getText()` (2认同)