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/
如果你真的想做这种事情,你必须手动提供正确的@(AKA this)call或apply:
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)
只是一个作用于类函数的变量中的函数,仅此而已.还要记住,因为它someFunction是Example类函数的本地函数,所以它不会以任何方式显示为子类.
| 归档时间: |
|
| 查看次数: |
2717 次 |
| 最近记录: |