coffeescript的N个tip

继续下学习coffeescript中学习到的一些小技巧。

构造函数的参数列表中可以直接指定类的成员变量

constructor: (@a,@b) -> 

这段代码会被翻译为

function A(a, b) {
  this.a = a;
  this.b = b;
}

这样既指定了成员变量又进行了赋值,一举两得。

更复杂一点的用法如下:

constructor:({@a,@b}={},c,@d)->

这里结合使用了@参数和普通参数,这是可以的。同时使用了默认参数与解构。编译后的代码:

function A(arg, c, d) {
  var ref;
  ref = arg != null ? arg : {}, this.a = ref.a, this.b = ref.b;
  this.d = d;
}

在成员函数中引用所属于的类

这其实是一个javascript的tip。

引用所属类,那还不简单,叫啥就写啥呗:

class A
    @static = 'A'

    func: ->
        console.log A.static

new A().func()

这样做会有一个不好的地方,就是如果A类重构的时候修改了名字的话,如果忘记了修改A类中所有调用自己的地方,就要出错咯。而别的语言中使用的多半是selfstatic这种与类名无关特殊变量,所以无此顾虑。

不过也不必顾虑,因为js中,方法的原型中的constructor指向方法本身。而js中的类也不过就是方法本身。所以可以这么写:

class A
    @static = 'A'

    func: ->
        console.log @constructor.static

new A().func()

coffeescript类继承实现原理

coffeescript作为javascript的高级语法糖,提供了同意的类继承方法:直接使用extend即可

TODO

coffeescript中如果定义了子类的构造函数,需要注意的地方

class A
    constructor: ->
        @name = 'A class'

    getName: ->
        console.log @name

class B extends A

a = new A
a.getName()  # A class
b = new B
b.getName()  # A class

B作为A的子类,继承了A的方法和成员变量name

但是如果B类明确定义了构造函数的话:

class B extends A
    constructor: ->
        # xxx

a = new A
a.getName()  # A class
b = new B
b.getName()  # undefined

可以看到,这时,B类中就没有A类的实力变量了。这时因为coffeescript使用的寄生组合式继承,需要在子类的构造函数中调用父类的构造函数,如果你不自定子类的构造函数,coffeescript会自动为你生成一个调用父类构造函数的构造函数,但是如果你自己定义了构造函数的话,coffeescript就无法这么做了。

看生成的js代码就明白了:

如果你没有为B书写构造函数,coffeescript自动生成了一个:

B = (function(superClass) {
    extend(B, superClass);

    function B() {
      return B.__super__.constructor.apply(this, arguments);
    }

    return B;

  })(A);

如果你为B定义了一个空的构造函数:

  B = (function(superClass) {
    extend(B, superClass);

    function B() {}

    return B;

  })(A);

为了完整的继承,如果我们声明了子类的构造函数,需要在最开始显式地调用super()以调用父类的构造函数。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值