我已经在前端使用coffeescript几年了。我熟悉类语法,看起来像这样:
class MyClass
methodOne : ->
console.log "methodOne Called"
methodTwo : (arg, arrg) ->
console.log "methodTwo Called"
最近,我一直在使用节点和带有coffeescript和node的Web应用程序的frappe样板。
此脚本使用CoffeeScript类进行具有以下语法的路由:
class MyClass
@methodOne = ->
console.log "methodOne Called"
@methodTwo = (arg, arrg) ->
console.log "methodTwo Called"
我可以从正常用法中注意到的唯一用法差异是Routes.coffee文件直接使用该类而不是生成new
对象。所以:
MyClass.methodOne()
# vs
new MyClass().methodOne()
现在我已经了解到@methodOne
语法没有使用.prototype
而其他语法没有。但为什么这会使用失败?
答案 0 :(得分:2)
因此,以@
开头的方法是类方法,其他所有方法都是实例方法。使用实例方法,:
实质上意味着公共,其中=
表示私有。 CoffeeScript中的类方法不存在“公共”与“私有”二分法,因此:
和=
可以执行此操作。他们都是公开的。
例如,看看这个类:
class MyClass
@methodOne = ->
@methodTwo : ->
methodThree : ->
methodFour = ->
评估以下JavaScript:
var MyClass;
MyClass = (function() {
var methodFour;
function MyClass() {}
MyClass.methodOne = function() {};
MyClass.methodTwo = function() {};
MyClass.prototype.methodThree = function() {};
methodFour = function() {};
return MyClass;
})();
因此,methodOne
和methodTwo
都是公共类方法,methodThree
可以继续使用原型,因此它是一个公共实例方法,methodFour
成为一个变量在类中可以在内部使用但永远不会公开暴露。
希望能回答你的问题吗?