闭包

closure = do ->
_private = "foo"
-> _private console.log(closure()) #=> "foo" //`do`关键词可以产生一个`Immediate Function` (function() {
var closure; closure = (function() {
var _private;
_private = "foo";
return function() {
return _private;
};
})(); console.log(closure()); }).call(this);
  • 闭包中经常需要绑定this的值给闭包的私有变量,CoffeeScript使用特殊的=>语法省去了这个麻烦
element = document.getElementById('id')
@clickHandler = -> alert "clicked"
element.addEventListener "click", (e) => @clickHandler(e) //
(function() {
var element; element = document.getElementById('id'); this.clickHandler = function() {
return alert("clicked");
}; element.addEventListener("click", (function(_this) {
return function(e) {
return _this.clickHandler(e);
};
})(this)); }).call(this);

扩展

  • 在js中,所有的对象都是开放的,有时候会扩展原有对象的行为
String::expends = -> @replace /_/g, "-"

//
(function() {
String.prototype.expends = function() {
return this.replace(/_/g, "-");
}; }).call(this);

class Person
_private = 'value' //private
@sex: true //Person.sex
@log: -> //Person.log
console.log 0 @create: (name, age)->
new Person(name,age) constructor: (@name, @age) ->
log: -> //instance.log
console.log @name
tell: => //instance.tell
console.log @age jinks = new Person('jinks', 23)
jack = Person.create('jack', 22)
  • constructor是构造函数,必须用这个名称

  • 构造函数中如果给实例变量赋值,直接将@name写在参数中即可,等价于在函数体中的@name = name

  • 对于实例方法,要用=>来绑定this,这样可以作为闭包传递

类的继承

class Gadget
constructor: (@name) ->
sell: =>
"buy #{@name}" class Iphone extends Gadget
constructor: -> super("iphone")
nosell: =>
"Don't #{@sell()}" iphone = new Iphone
iphone.nosell()
  • 使用extends关键字可以继承父类中的所有实例属性,比如sell
  • super方法可以调用父类的同名方法
  • 如果不覆盖constructor,则她被子类默认调用

混入(Mixin)

在ruby语言中的Mixin,能够让你的类获得多个模块的方法,可以说是对多重继承一种很好的实现

class Module
@extend: (obj) ->
for key, value of obj
@[key] = value @include: (obj) ->
for key, value of obj
@::[key] = value classProperties =
find: (id) ->
console.log ("find #{id}") instanceProperties =
save: ->
console.log ("save") class User extends Module
@extend classProperties
@include instanceProperties user = User.find
user = new User
user.save()
  • 继承了Module的类才可以Mixin,当然,这里也可以用组合或者直接为js的构造函数做Monkey patching
  • classProperties是类成员模块,使用@extend来Mixin,实现是简单的拷贝对象的属性
  • instanceProperties是实例成员模块,使用@include来Mixin,实现是拷贝对象原型的属性
  • 需要指出的是,这里的拷贝是引用拷贝,有可能外部会更改被Mixin的模块内部值,更好的方法是深层值拷贝(clone)

coffeeScript学习02的更多相关文章

  1. JavaScript学习02 基础语法

    JavaScript学习02 基础语法 JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.s ...

  2. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  3. Python学习02 列表 List

    Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...

  4. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  5. Java学习02

    Java学习02 1.导入内部的包 一.在包的下面加入下面一句话: import    java.util.Scanner; 二.在类中 Scanner input=new     Sanner(Sy ...

  6. ThinkPhp学习02

    原文:ThinkPhp学习02 一.什么是MVC                M -Model 编写model类 对数据进行操作 V -View  编写html文件,页面呈现 C -Controll ...

  7. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  8. 2018.12.22 Spring学习02

    Spring学习02 1.使用注解配置Spring 1.1 为主配置文件引入新的命名空间(约束) 添加约束文件xxx-xxx-context.xml 添加到主配置文件中 选择刚才的context.xm ...

  9. 天脉2(ACoreOS653)操作系统学习02

    天脉2(ACoreOS653)操作系统学习02 一.分区内通信方法 分区内通信指同一分区内进程之间的通信.ARINC 653定义的分区内进程通信机制,包括:缓存队列(Buffers-Queue).黑板 ...

随机推荐

  1. ListView之BaseAdapter的使用

    话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...

  2. 【leetcode】Largest Number ★

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  3. The certificate used to sign "XXX" has either expired or has been revoked

    在Xcode真机调试开发过程中,无论是使用个人证书或者是企业证书,经常会遇到这样的问题:The certificate used to sign "XXX" has either ...

  4. xmpp xml基本语义

    基本语义 9.2.1 消息语义 <message/>节种类可被看作“推”机制,一个实体推信息给其它实体,与 EMAIL 系统中发生的通信类似.所有消息节应该拥有‘to’ 属性,指定有意的消 ...

  5. cell分割线宽度不满屏处理

    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZ ...

  6. 模拟赛1030d1

    [问题描述]从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少.[输入格式]第一行一个数字?.[输出格式]一行一个整数代表答案对100000007取模之后的答案.[样例 ...

  7. SQL Server之存储过程基础知

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...

  8. 命名空间 - PHP笔记

    转: 概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命 ...

  9. php 时间倒计时

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. php建立多层目录的函数

    /** *根据路径path建立多级目录 *$dir目标目录 $mode权限,0700表示最高权限 */ function makedir( $dir , $mode = "0700" ...