coffeescript
JavaScript没有传统的类系统。 相反,它具有原型。 原型可以非常通用且功能强大,但是它们会使新手感到困惑。 因此,CoffeeScript创建了一个传统的类系统。 但是……怎么了? CoffeeScript的口号是“ It's Just JavaScript”,而JavaScript显然缺少传统的类系统。 在本文中,我们介绍了创建CoffeeScript类的基础知识。 在下一篇文章中,我们将深入研究(相对高级)生成JavaScript,以了解魔术的工作原理。
家长班
我们将主要通过示例进行此操作,因为对于那些阅读了我关于coffeescript的介绍性文章的人来说,应该很容易了解所发生的事情。
class Bourgeoisie
constructor: (@age, @privilegeConstant) ->
worry: ->
console.log("My stocks are down 1%!")
profit: (hardWork, luck) ->
return (@age - 23) * hardWork * (luck + @privilegeConstant)
elite = new Bourgeoisie(29, 397)
elite.worry() # "My stocks are down 1%!"
elite.profit(20, 50) #53640
我们声明一个名为Bourgeoisie
的类。 类上的函数声明如下:
functionName: (arguments) ->
code
很明显, constructor
函数被命名为constructor
。 它使用age
和priviligeConstant
这两个参数,并自动将它们分配为实例变量( @
是this
的CoffeeScript替代,当在构造函数的参数中使用时,会自动将变量分配给实例)。 当您创建新的Bourgeoisie
(如代码示例底部),将自动调用构造函数。 我们还有另外两个功能。 首先, worry
。 第二个, profit
,接受两个参数并返回一个数字。
继承的类
现在我们想要一个继承自Bourgeoisie
的类。 我们称它为Senator
。
class Senator extends Bourgeoisie
worry: ->
console.log("The polls are down 1%!")
senator = new Senator(45, 992)
senator.worry() # "The polls are down 1%!")
senator.profit(6, 10) # 132264
该类扩展了 Bourgeoisie
,这意味着它具有父类的所有特征。 constructor
和profit
函数完全相同 ,唯一的区别是构造实例时,您要调用Senator
而不是Bourgeoisie
。
另一方面, worry
功能是不同的。 Senator
对民意调查的担忧比对股票的worry
还要多,因此他的worry
覆盖了上层阶级的worry
。 在Student
班级中再次看到了这种覆盖,如下所示。
class Student extends Bourgeoisie
worry: ->
console.log("Does my privilege inherently make me complicit in the repression of less fortunate classes?")
profit: (hardWork, luck, tuition) ->
super(hardWork, luck) - tuition
student = new Student(21, 89)
student.worry() #"Does my privilege inherently make me complicit in the repression of less fortunate classes?"
student.profit(10, 10, 10000) #-11980
学生的worry
覆盖了父母的worry
(比参议员的worry
更为戏剧化),他们的profit
也被覆盖。 但是,覆盖现在取决于父类的profit
函数。 它接受并减去学费。 成为学生是一个糟糕的时刻! 但是,您真正应该从中学到的是super
关键字,该关键字调用函数的父版本。
但是,我喜欢原型
对你有好处! CoffeeScript给您带来便利,但仍然让您拥有力量。 让我们使用它! 这是我们上次的缩写示例:
object = (o) ->
F = ->
F.prototype = o
new F()
soldier = new Object()
soldier.a = jump
soldier.r = machineGun
sniper = object(soldier)
sniper.r = snipe
woundedSniper = object(sniper)
woundedSniper.a = -> console.log('aaaargh my leg!')
woundedSoldier = object(soldier)
woundedSoldier.a = woundedSniper.a
这看起来应该很熟悉,因为90%的更改是用尖的箭头替换了几个function
。 原型继承系统保持不变,因为请记住,CoffeeScript只是JavaScript。 语法更简洁,如果您想以我们上次使用的Brendan Eich样式实现原型,没有更多的东西要学习。 这并不是说CoffeeScript没有应用某些快捷方式。 您可以使用::
而不是prototype
。 但是,在Brendan Eich风格的原型中,我们只需要在object(o)
方法中使用一次即可。 我们还可以访问extends
和super
关键字,但是它们仅在构造函数中使用-我们再次将其隐藏在object(o)
方法中。
结论
CoffeeScript中的经典继承系统为普通开发人员提供了便利和舒适。 此外,CoffeeScript更清晰的语法使实现真正的原型系统稍微容易一些。 根本没有办法输。
coffeescript