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