CoffeeScript类PrivateMethod,它使用实例属性Issue

时间:2014-08-28 01:00:47

标签: javascript coffeescript

我目前正在研究CoffeeScript并遇到了烦人的问题。 当我创建写为privateMethod = ->的类privateMethod并且如果我想在方法中使用@ a.k.a this属性时,由于范围问题,我会收到语法错误。 请参阅下面的示例代码

class TestClass
  constructor : (@name = "NoName") ->
  privateFunc = ->
    console.log @name
  callPrivateFunc : ->
    privateFunc()

testClass = new TestClass("John")
testClass.callPrivateFunc() # @name is undefined

到目前为止,我找到了避免这个问题的两种方法。

案例1:使用.call

class TestClass
  constructor : (@name = "NoName") ->
  privateFunc = ->
    console.log @name
  callPrivateFunc : ->
    privateFunc.call(this)

testClass = new TestClass("John")
testClass.callPrivateFunc() # "John"

案例2:将此arg作为函数参数传递

class TestClass
  constructor : (@name = "NoName") ->
  privateFunc = (that)->
    console.log that.name
  callPrivateFunc : ->
    privateFunc(@)

testClass = new TestClass("John")
testClass.callPrivateFunc() # "John"

我的问题是,这些方法是否正确使用使用this的私有方法? 还是有任何正确的方法/事实标准?

感谢您的回答

1 个答案:

答案 0 :(得分:0)

就“正确”的方式而言,我认为没有。使用.call对我来说更正确。这就是为什么.call存在的原因。我还要看一下Function.prototype.bind。它用于将thisArg绑定到函数。看看这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

.bind示例:

class TestClass
  constructor : (@name = "NoName") -> privateFunc.bind(this)();
  privateFunc = ->
    alert @name

testClass = new TestClass("John") # alerts "John"

电子;这也值得一读:http://jsforallof.us/2014/07/08/var-that-this/