1

我对 coffeescript 和 javascript 中的对象都很陌生。我在咖啡脚本中有这段代码:

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;
})();

方法greetingsupperName有什么区别???
: ”在课堂上做什么?

谢谢

4

2 回答 2

6

符号汇总(左=CS,右=JS)

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和函数作为值的对象文字。


查看编译后的 CoffeeScript 代码

var ClassObject;

ClassObject = (function() {
  var privateVar;

  function ClassObject() {}

  ClassObject.prototype.instanceMethod = function() {};

  ClassObject.classMethod = function() {};

  ClassObject.classMethod2 = function() {};

  privateVar = "private";

  return ClassObject;

})();
于 2012-10-11T16:11:41.403 回答
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 和问候语)。

于 2012-10-11T16:02:56.187 回答