coffeescript_CoffeeScript中的类

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 。 它使用agepriviligeConstant这两个参数,并自动将它们分配为实例变量( @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 ,这意味着它具有父类的所有特征。 constructorprofit函数完全相同 ,唯一的区别是构造实例时,您要调用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)方法中使用一次即可。 我们还可以访问extendssuper关键字,但是它们仅在构造函数中使用-我们再次将其隐藏在object(o)方法中。

结论

CoffeeScript中的经典继承系统为普通开发人员提供了便利和舒适。 此外,CoffeeScript更清晰的语法使实现真正的原型系统稍微容易一些。 根本没有办法输。

翻译自: https://www.sitepoint.com/classes-in-coffeescript/

coffeescript

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值