Javascript 如何在CoffeeScript中访问类方法?

Javascript 如何在CoffeeScript中访问类方法?,javascript,coffeescript,Javascript,Coffeescript,我的前言是: 作为一个整体,我对CoffeeScript和JavaScript原型还不熟悉 这就是说,我试图在CoffeeScript中创建一个类的新对象,然后调用getter来检索变量,但实际情况是我得到了一个“未定义”的响应。我做错了什么,或者我应该如何处理这个问题。我是新来的,正在努力遵循接吻的标准 class TestHandler constructor: -> testArray = [] getTestArray: -> @testArray tH

我的前言是: 作为一个整体,我对CoffeeScript和JavaScript原型还不熟悉

这就是说,我试图在CoffeeScript中创建一个类的新对象,然后调用getter来检索变量,但实际情况是我得到了一个“未定义”的响应。我做错了什么,或者我应该如何处理这个问题。我是新来的,正在努力遵循接吻的标准

class TestHandler
  constructor: ->
  testArray = []
  getTestArray: ->
    @testArray

tH = new TestHandler()
tH.testArray.push 1 #testArray returns undefined
tH.getTestArray().push 1 #getTestArray returns undefined
console.log tH.getTestArray()

当您在CoffeeScript中创建一个类时,您列出的每个metod都会转到
prototype
属性(在本例中为
TestHandler.prototype
),因此在该类的实例之间共享,但是每个其他属性都将是
TestHandler
本身的成员(如果名称前面有
@
)或作用域为的私有变量,则
最终将编译到的函数(与
testArray=[]
类似)。这意味着您的
tH
将不会有名为
testArray
的属性。若您希望它成为每个实例的自有属性,请将其放入构造函数中:

class TestHandler
    constructor: ->
        @testArray = []
    getTestArray: ->
        @testArray

tH = new TestHandler()
tH.testArray.push 1 #now everything works
tH.getTestArray().push 1
console.log tH.getTestArray()

一般来说,财产将在哪里着陆取决于您如何在
类中编写声明

 class TestHandler
   constructor: ->
     @testArray = [] #1
   testArray = [] #2
   @testArray = [] #3
   getTestArray: -> #4
   testArray: [] #5
以及它编译为的代码:

 var TestHandler;

 TestHandler = (function() {
   var testArray;

   function TestHandler() {
     #1 @thisArray in constructor becomes instance property accessor
     this.testArray = [];
   }

   #2 becomes a local variable, not available outside this function
   testArray = [];

   #3 becomes a "static" property
   TestHandler.testArray = [];

   #4 is a method that goes to the prototype, so that it can be shared with all instances
   TestHandler.prototype.getTestArray = function() {};

   #5 is a property that goes to the prototype and can be shared with all instances (although this shouldn't be done unless you know what you do)
   TestHandler.prototype.testArray = [];

   return TestHandler;

 })();

因此,为了验证,构造函数之外的所有内容都是伪静态的,但是这些静态对象可以访问类内部的动态对象?不完全是。这取决于您如何编写它。使用
@
内部
构造函数
->自身的实例属性(就像我使用
@testArray
内部
构造函数
).With
@
在类内部->静态成员。
名称:->
在类内部->共享方法。
name=value
在类内部->私有变量,作用域为类将编译到的函数。我将更新我的答案,以包含我在该注释中编写的内容,以便这将是清楚的。查看更新的代码后,那么,我应该将所有类方法(如getter)放在构造函数中吗?实例共享的方法将在它们的上下文中调用。这意味着如果您执行
tH.getestArray()
method
TestHandler.prototype.getestArray
将被调用,因为它是
tH
的一个方法,因此可以访问它的属性(
它里面的这个
将指向
tH