coffeeScript学习02
闭包
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的更多相关文章
- JavaScript学习02 基础语法
JavaScript学习02 基础语法 JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.s ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- Python学习02 列表 List
Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...
- Android Testing学习02 HelloTesting 项目建立与执行
Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...
- Java学习02
Java学习02 1.导入内部的包 一.在包的下面加入下面一句话: import java.util.Scanner; 二.在类中 Scanner input=new Sanner(Sy ...
- ThinkPhp学习02
原文:ThinkPhp学习02 一.什么是MVC M -Model 编写model类 对数据进行操作 V -View 编写html文件,页面呈现 C -Controll ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- 2018.12.22 Spring学习02
Spring学习02 1.使用注解配置Spring 1.1 为主配置文件引入新的命名空间(约束) 添加约束文件xxx-xxx-context.xml 添加到主配置文件中 选择刚才的context.xm ...
- 天脉2(ACoreOS653)操作系统学习02
天脉2(ACoreOS653)操作系统学习02 一.分区内通信方法 分区内通信指同一分区内进程之间的通信.ARINC 653定义的分区内进程通信机制,包括:缓存队列(Buffers-Queue).黑板 ...
随机推荐
- Volley与XUtils网络请求使用对比,心得,两者基本使用
之前一直使用的Volley作为网络请求框架,它是Google 在2013年的I/O大会 上,发布的.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,同时扩展性很强.在 ...
- 【XLL API 函数】xlGetName
以字符串格式返回 DLL 文件的长文件名. 原型 Excel12(xlGetName, LPXLOPER12 pxRes, 0); 参数 这个函数没有参数 属性值和返回值 返回文件名和路径 实例 \S ...
- n数乘积第m小
这是从Java贴吧看到的一道面试题,看了别人的解题思路实现的.... 如题: n个数,他们的乘积可得到一些其它的数,求第m小的. 输入格式: n m n1 n2 n3 ... 例: 输入: 3 8 2 ...
- JavaScript基础——定义变量
在JavaScript中使用变量来临时存储和访问来自JavaScript文件的数据.变量既可以指向简单的数据类型,如数字或者字符串:也可以指向更复杂的数据类型,比如对象. 在JavaScript中定义 ...
- 二、JavaScript语言--事件处理--DOM事件探秘
第一章 事件流 事件:是文档或浏览器窗口中发生的.特定的交互瞬间.JavaScript和HTML之间的交互都是通过事件来实现的. 事件流:描述的是从页面中接受事件的顺序 IE:事件冒泡流 Netsca ...
- 昨晚值班将发dla的程序改好后放入正式环境
可是在修改的topic的发送文件中出现有节点没有对应,整个过程陆续调至有20分钟最后11电把新程序换掉.
- Clr Via C#读书笔记---线程基础
趣闻:我是一个线程:http://kb.cnblogs.com/page/542462/ 进程与线程 进程:应用程序的一个实例使用的资源的集合.每个进程都被赋予了一个虚拟地址空间. 线程:对CPU进行 ...
- Java集合源码学习(三)LinkedList分析
前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...
- python实现支持并发、断点续传的Ftp程序
一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...
- Cash Cow【dfs较难题应用】【sdut2721】
Cash Cow Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdut ...