下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CoffeeScirpt这本书是完全开源的,作者是AlexMacCaw@maccman),DavidGriffiths、SatoshiMurakami和JeremyAshkenas也做了不小的贡献。如果你有任何勘误和建议,千万别到本书的page发个ticket。或许还对我的另外一本书JavaScriptWebApplicationsbyO’Reilly感,我在该书中对富JavaScript更重要的是,JavaScript有很多不为人知的,这些往往让无经验的开发者摔跤。Cfeecrip的劣势是什么?是的,在你和JavaScrip之间了编译这一步。Cfeecript也在尝试尽力通过产生优雅的可读性强的JavaScrip,以及在服务器端集成自动编译来弥补feeScrip发展迅猛,相关的IRC列表也是人才济济,如果你有什么问题的话,都会得到迅速的解答。说在Node.js上。还有,CoffeeScript越来越广泛,有的集成,比方说它已经是Rails3.1 点击TryCoffeeScript。这个使用浏览器版的CoffeeScript编译器,把在左边面板任意<scriptsrc=" coffee-script.js"type="text/javascript"charset="utf-8"></script><scripttype="text/coffeescript">#SomeCoffeeScriptnpminstall-gcoffee- pilemy-CoffeeScript语#AAmultilinecomment,perhapsa不的话,就很容易在定义变量时遗漏var关键字导致产生全局变量。CoffeeScript通过myVariable= exports=exports.MyVariable="foo-func=->func=-#Anextratimes=(a,b)->a*times=(a=1,b=2)->a*你还可以使用参数槽(splats)接收多个参数,使用...sum=(nums...)->result=0nums.forEach(n)->result+=ntrigger=(events...)->events.splice(1,0,this)a="Howdy!"alerta#Equivalentalertinspect#Equivalentalert如果在调用一个函数时你没有传递参数,CfeeScript就没有办法判断出你打算调用这个函数,还是只是把它当作一个变量。从这点来看,CfeeSript的行为与Ruby有些差异,后者总是会调用函数的变量,CfeeScript更像Pythn。这已经变成了我的feeScrip中常见的错误。因此,在你打算无参数调用函数时多留个心眼,别忘了加上括号。this.clickHandler=->alert"clicked"element.addEventListener"click",(e)=>this.clickHandler(e)的object1={one:1,two:#Withoutobject2=one:1,two:#Usingnewlinesinsteadofobject3one:two:User.create(name:"John同样的,数组可以使用空格来代替分隔作用的逗号,但是方括号([])还是需要的array1=[1,2,array2=[23]array3=iftrue=="We'reiftrue!=truethen#Equivalent#(1>0)?"Ok":if1>0then"Ok"elsealert"It'scold!"ifheat<ifnottruethenunless与not类似的风格,CoffeeScript还为大家提供了is语句,编译过去就是===iftrueis"Typecoercion你可以使用isnt代替isnotiftrueisntalert"Opposite在上面的例子中你可以已经注意到了,CoffeeScript会把==操作符转化为===,把!=转化为favourite_color="Blue.No,question="Bridgekeeper:What...isyourfavouriteGalahad:#{favourite_color}Bridgekeeper:Wrong!"就上例所示,多行字符串是允许的,不需要在没一行前添加+fornamein["Roger","Roderick","Brian"]alert"Release#{name}"forname,iin["Rogerthepickpocket","Rodericktherobber"]alert"#{i}-Release#{name}"releaseprisonerforprisonerin["Roger","Roderick",prisoners=["Roger","Roderick",releaseprisonerforprisonerinprisonerswhenprisoner[0]names=sam:seaborn,donna:alert("#{first}#{last}")forfirst,lastofnum=minstrel=whilenum-=num+"BraveSirRobinranrange=firstTwo=["one","two",numbers=numbers[3..5]=[-3,-4,-my="mywords=["rattled","roudy","rebbles","ranks"]alert"Stopwaggingme"if"ranks"inwordsCoffeeScript采用了一些有用的别名来减少输入量。其中一个就是@,是this@saviour=另外一个是::,prototype的别名User::first=->praiseif你还能用它来替换||velocity=southern?类classanimal=new init类似。classAnimalconstructor:(name)->@name=classAnimalconstructor:(@name)->animal=newAnimal("Parrot")alert"Animalisa#{}"classAnimalprice:5sell:(customer)-animal=newAnimalanimal.sell(newCustomer)classprice:sell:alert"Giveme#{@price}animal=newclassthis.find=(name)-classAnimal@find:(name)->继承与classAnimalconstructor:(@name)->alive:-classParrotextendsAnimalconstructor:->dead:-notParrot.super.constructor.call(this"Parrot");。实际上,这与classAnimalconstructor:(@name)->classParrotextendsAnimalAnimal::rip=trueparrot=newalert("Thisparrotisnomore")ifextend=(obj,mixin)-obj[name]=methodforname,methodofmixininclude=(klass,mixin)->totype,mixin#includeParrot,isDeceased:true(new =['extended',classModule@extend:(obj)->forkey,valueofobjwhenkeynotinmodule@[key]=value@include:(obj)-forkey,valueofobjwhenkeynotinmodule#Assignpropertiestotheprototype@::[key]=value classProperties=find:(id)->create:(attrs)-instanceProperties=save:->classUserextendsModule@extendclassProperties@includeinstanceProperties#user=user=newUserORMfind:(id)->create:(attrs)->extended:->save:->classUserextendsModule@extendORMCoffeeScript惯用在JavaScript中可以使用新加入的forEach()也可以使用老的C语言风格的for循环来迭代一个数组。如果你打算使用一些在ECMAScript5提到的JavaScript新特性的话,我推荐你把这个shim(薄层)来模拟这些特性以便支持老的浏览器。for(vari=0;i<array.length;i++)i){myFunction(item)myFunction(item)foritemin这种语法易读简洁(你也这么认为),而且更棒的是这在背后会被编译为for循环。换varresult=for(vari=0;i<array.length;i++)varresult=array.map(function(item,returnresult=(foriteminvarresult=for(vari=0;i<array.length;if(array[i].name=="test")result=array.filter(function(item,==result=(ispassed=[]failed=(ifscore>60thenpassedelsefailed).pushscoreforin[49,58,76,82,88,#passed=(scoreforscoreinscoreswhenscore>passed=[]failed=forscorein[49,58,76,82,88,(ifscore>60thenpassedelsefailed).push通常使用indexOf()来测试一个数组中是否包含某个值。不过真让人惊讶Internetvarincluded=(array.indexOf("test")!=-included="test"inincluded="alongteststring".indexOf("test")isnt-或者更好一点,借助于位操作符我们就不用与-1进行比较 ="alongteststring"included=!!~string.indexOf"test"varobject={one:1,two:for(varkeyinobject)alert(key+"="+object={one:1,two:alert("#{key}=#{value}")forkey,valueof这个技巧虽然不是CoffeeScript的专利,但是我觉得它非常有用,值得一提。Math.max和Math.max[14,35,-7,46,98]...#Math.min[14,35,-7,46,98]...#-Loglog:->LoglogPrefix:log:(args...)->args.unshift(@logPrefix)if@logPrefix偏爱英语风格的代码的话,也可以使用is代替==,isnt代替!=string="migratingcoconuts"string==string#truestringisstring#trueCoffeeScript还有另外一个非常好的扩展,Ruby程序员可将其看作像是||=这样的模式hashor=hash?=someObject={a:'valuefora',b:'valueforb'{a,b}=console.log"ais'#{a}',bis{join,resolve}=join('/Users',没有什么差别。在CoffeeScript中使用jQuery显得非常优雅,因为jQuery的API中有很多回#Uselocal$=$-#$(".el").click->既然CoffeeScript编译输出的所有代码都被包裹在一个函数中,因此我们可以使用一个局部变量$来代替jQuery。就算在jQuery的noconfict模式或者$被重定义的情况下,我 #Executefunction type=do->classToType={}fornamein"BooleanNumberStringFunctionArrayDateRegExpUndefinedNull".split("")classToType["[object"+name+"]"]=#Returna(obj)-strType=CoffeeScriptt如第一章所说,我们可以使用coffee命令来编译CoffeeScript pile--outputlibCake是一个超级简单的与Make和Rake类似的构建工具。该库被在coffee-script你可以使用在一个名为Cakefile的文件中使用CoffeeScript来定义任务。Cake可以去 创建一个名为Cakefile的文件,还有两个——lib和src。把下面的代码添加到Cakefs=require{print}=require{spawn}=requirebuild=(callback)-coffee=spawn'coffee',['-c','-o','lib','src']coffee.stderr.on'data',(data)->process.stderr.writedata.toString()coffee.stdout.on'data',(data)->printdata.toString()coffee.on'exit',(code)->callback?()ifcodeistask'build','Buildlib/fromsrc/',-><!DOCTYPE<scriptsrc="lib/app.js"type="text/javascript"我们在CoffeeScript代码变了之后还需要手动的运行cakebuild命令,这很不理想。幸运的是,coffee命令接受另外一个--watch参数,指示它监视一个的变化并且按需重新task'watch','Watchsrc/forchanges',-coffee=spawn'coffee',['-w','-c','-o','lib','src']coffee.stderr.on'data',(data)->process.stderr.writedata.toString()coffee.stdout.on'data',(data)->printtask'open','Openindex.html',-#Firstopen,thenwatchspawn'open','index.html'invoke'watch'option'-o','--output[DIR]','outputdir'task'build','Buildlib/fromsrc/',->#Nowwehaveaccesstoa`options`coffee=spawn'coffee',['-c','-o',options.outputor'lib','src']coffee.stderr.on'data',(data)->process.stderr.writedata.toString()coffee.stdout.on'data',(data)->printdata.toString()Rails3.1通过Sprockets&theassetpipeline实现了对CoffeeScript的支持。的Rack服务器是其他可选方案之一,比如说37signal的Pow和JoshuaPeek的Nack都是。如果既然你基本已经了解了CoffeeScript的语法,那现在让我们来探索下如何使用它来实弹了本章的范围,需要的话我建议你到JavaScriptWebApplications翻看我的书,或者使用像Backbone或者Spine这类框架。现在先不管那些,在这里我们使用CommonJS模块来构建结构&那什么CommonJS模块到底是什么呢?好的,如果你用过NodeJS的话,你大概没有 有的JavaScript实现。目标是写一个给Rhino的类库也可以用于Node。终于这种思想被移植 User=##SomemyFineProperty=我采用Stitch这个不太有名的类库作为解决方案。Stitch的作者是SamStephenson,其思想赖。噢,我差点忘记说,它还能编译CoffeeScript、JS模板、LESSCSS和Sass。首先,如果你必须安装 :stitch=require("stitch")express=require("express") =package=#SpecifythepathsyouwantStitchtoautomaticallypaths: dirname+"/app"#Specifyyourbase dirname+])app=app.configure-app.set"views", dirname+"/views"app.useapp.routerapp.useexpress.static(dirname+"/public")app.get"/application.js",package.createServer()port=argv[0]orprocess.env.PORTorconsole.log"Startingserveronport:#{port}"app.listenport{"name":"version":"0.0.1","dependencies":{"stitch":"express":}}npminstallnpminstall-gcoffee-coffee module.exports=App=init:->#Bootstrapthe <!DOCTYPE<!--RequirethemainStitchfile--<scriptsrc="/application.js"type="text/javascript"<scripttype="text/javascript"charset="utf-.addEventListener("DOMContentLoaded",function(){varApp=require("app");},#module.exports=classUserconstructor:(@name)->#User=JavaScript模<%if@projects.length:<%forprojectin@projects:<ahref="<%=project.url%>"><%=<p><%=project.description<%end<%else:%>Noprojects<%end<%expression<%=expression<%-expression <%end%>来表示缩进块<%if@project.isOnHold():%>OnHold<%end<%if@project.isOnHold():%>OnHold<%end<%="OnHold"if@project.isOnHold()<label>Name:<%=@namerequire("views/users/show")(newUser=require("models/user")App=init:-template=require("views/users/show") =template(new#ObviouslythiscouldbesprucedupbyjQueryelement=.createElement("div")element.innerHTML=viewmodule.exports=echo"web:coffeeindex.coffee">gitinitgitaddgitcommit-m"FirstherokucreatemyAppName--stackcedargitpushherokumasterherokuMustache、Jade或者CoffeeKup(使用纯集成了CoffeeScriptMVC框架Spine。node-browsify是另外一个类似的项目。如果你想使用express集成的更底层的东西,TrevorBurnham的connect-assets不错。JavaScript的子 ={=}化。还有,with语句并不能被像uglify-js这样的压缩工具压缩掉。因此它在将来的usersCount= //vargroupsCount= //pagesCount= //varpostsCount=4;//outerScope=do-innerScope=varouterScope;outerScope=true;(function(){varreturninnerScope=注意CfeeScrip是如何自动的在上下文中第一次使用时自动的初始化变量(使用),覆用,以你心package=classHembuild:->#Overwritesouterpackage hemPackage:->classwindow.Assetconstructor:->function()(window.options||function(){}(window.options||myObj=delete:"Iama}myObj.class=-varmyObj;myObj={"delete":"IamamyObj["class"]=function()来自JavaScriptGarden’sequalitysection,对这个问题进行过深入的研究。00"0alert("EmptyArray")unless[].lengthalert("EmptyString")unless""alert("Number0") unless0alert("Thisisnotcalled")unlessfunctionwem()if(true)functiondeclaration()return}}elsefunctiondeclaration()return}}如果你想更加深入的了解函数定义式的话,你可以JuriyZaytsev的指南,他对标准进varwem= token错误。既可以使用括号也可以多加一个点来解决这个问使用99%的时间中,应该有更好更安全的替代方式(比方说方括号)#Don'tdomodel=#Usesquarebracketsmodel=使用typeofundefinedVaris为了说明问题所在,这是从JavaScriptGarden拿来的表格,该表格展示了这个类型检测的关newnewnewnewnew
newArray(1,2,3) new newRegExp("meow") new 那在JavaScript中我们如何做类型检查呢?还好有Ototype.toString()来解type=do->classToType={}fornamein"BooleanNumberStringFunctionArrayDateRegExpUndefinedNul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 锻件锻造课程设计
- 职高课程设计思路与设计
- 钻孔夹具设计课程设计
- 语文拓展模块课程设计
- 玻璃压花课程设计案例
- GB/T 33136-2024信息技术服务数据中心服务能力成熟度模型
- 2024年钢筋混凝土生产销售合同
- 2024版全新搅拌车买卖买卖合同下载
- 2024版国际油气田勘探与开发合同
- 2024版地材供货与绿色建筑标准合同样本3篇
- 小儿甲型流感护理查房
- 雾化吸入疗法合理用药专家共识(2024版)解读
- 寒假作业(试题)2024-2025学年五年级上册数学 人教版(十二)
- 银行信息安全保密培训
- 市政道路工程交通疏解施工方案
- 2024年部编版初中七年级上册历史:部分练习题含答案
- 拆迁评估机构选定方案
- 床旁超声监测胃残余量
- 上海市松江区市级名校2025届数学高一上期末达标检测试题含解析
- 综合实践活动教案三上
- 《新能源汽车电气设备构造与维修》项目三 新能源汽车照明与信号系统检修
评论
0/150
提交评论