我是coffeescript的新手,也是javascript中的对象。 我在coffeescript中有这段代码:
class Animal
constructor: (name) ->
@name = name
@upperName: ->
@name.toUpperCase()
@greetings ->
console.log 'Hello %s', @name
this.type = 'Animal'
这是“编译”到这个javascript:
var Animal
Animal = (function() {
function Animal(name) {
this.name = name;
({
this.upperName: function() {
return this.name.toUpperCase();
}
});
this.greetings(function() {
return console.log('Hello %s', this.name);
});
}
Animal.type = 'Animal';
return Animal;
})();
方法问候语和 upperName 之间的区别是什么? 什么“:”在课堂上做什么?
由于
答案 0 :(得分:6)
class Animal
内:
identifier: value Animal.prototype.identifier = value
@identifier: value Animal.identifier = value
@identifier= value Animal.identifier = value
identifier = value identifier = value (private var)
其他地方(按相同的编译结果排序)
Animal::identifier = value Animal.prototype.identifier = value
Animal.identifier = value Animal.identifier = value
identifier = value identifier = value
// New:
@identifier = value this.identifier = value
identifier: value { identifier: value} (object literal)
@identifier: value ---INVALID---
在CoffeeScript中,@编译为this
。
在class
构造的上下文中,方法定义受@
(this)的影响。这是一个简单的例子:
class ClassObject
instanceMethod: ->
# This method will be defined on the prototype (available to instance)
@classMethod: ->
# This method is defined on the class object itself, not on the instance
this.classMethod2 = -> # See previous and below
privateVar = "private"
虽然语法略有不同,但最新的两个具有相同的编译结果。
:
在类块中意味着什么?”它用于定义属性。当使用=
(等号)时,将定义“私有”变量。
:
在(构造函数)方法中的含义是什么?在类的级别之外(例如顶级代码,函数内部,构造函数等),:
没有“特殊类”的含义。 :
是对象文字中键名对之间的分隔符
您的代码@upperName: -> ...
无效,并且无法在最新的CoffeeScript版本中编译。 upperName: -> ...
是有效的,并且将编译为具有属性upperName
和函数作为值的对象文字。
var ClassObject;
ClassObject = (function() {
var privateVar;
function ClassObject() {}
ClassObject.prototype.instanceMethod = function() {};
ClassObject.classMethod = function() {};
ClassObject.classMethod2 = function() {};
privateVar = "private";
return ClassObject;
})();
答案 1 :(得分:0)
您编写的缩进代码无法编译。这就是我的意思:
class Animal
constructor: (name) ->
@name = name
upperName: ->
@name.toUpperCase()
greetings: ->
console.log "Hello #{@name}"
如果你编译它,输出应该更有意义。如果我们使用以下代码运行它:
a = new Animal 'panda'
console.log a.name
console.log a.upperName()
a.greetings()
我们得到预期的输出:
panda
PANDA
Hello panda
类定义与普通对象定义类似 - 它们是一组属性和值。在这种情况下,我们将动物定义为一组3个属性,它们都是函数(构造函数,upperName和greetings)。