闭包

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. RedHat下安装MySQL

    下载mysql 解压tar -xvf mysql-5.7.16-1.el6.x86_64.rpm-bundle.tar 安装MySQL-server包 rpm -ivh mysql-community ...

  2. java web统计当前访问用户数量

    1.使用SessionListener监听器,监听创建与销毁session的操作,利用计数方式记录当前session的数量

  3. NYOJ之ASCII码排序

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsAAAAIFCAIAAABTaNy/AAAgAElEQVR4nO3dO1LjzMIG4H8T5CyEdF

  4. 将前台json对象传入java后台

    前台json格式的数据如何传入后台 1. 将要传入后台的数据组装成JSON格式的字符串: var jsonStr = [{'name':'jim' , 'age':20} , {'name':'kin ...

  5. 你可能不知道的java、python、JavaScript以及jquary循环语句的区别

    一.概述 java循环语句分为四种形式,分别是 while, do/while, for, foreach: python中循环语句有两种,while,for: JavaScript中循环语句有四种, ...

  6. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  8. revert merge会出现的问题

    比如当我们git revert的时候, git revert Git会抱怨: is a merge but no -m option was given 这是因为你revert的那个commit是一个 ...

  9. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  10. WCF批量打开服务

    WCF服务.利用循环,读取配置文件,打开所有的代理服务 和关闭代理服务的方法 //list列表 ,用于存储打开的服务列表 List<ServiceHost> _host = new Lis ...