要系統(tǒng)的學(xué)習(xí)JavaScript要掌握以下知識(shí):首先掌握HTML和CSS,這是基礎(chǔ)也是學(xué)習(xí)JavaScript的時(shí)候需要用到的知識(shí)。 千鋒教育就有線(xiàn)上免費(fèi)JavaScript線(xiàn)上公開(kāi)課。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)荷塘,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):13518219792
其次,剛開(kāi)始入門(mén)不建議看《JavaScript權(quán)威指南》和《JavaScript高級(jí)程序設(shè)計(jì)》這些書(shū)籍。并非這些書(shū)籍不好,相反這些書(shū)籍是公認(rèn)的好書(shū)!主要是因?yàn)檫@些書(shū)籍內(nèi)容太多太厚了,很容易讓你走上‘從入門(mén)到放棄’道路!對(duì)于初學(xué)者而言,多而全意味著主次難分,無(wú)法取舍;此時(shí)你想把JavaScript學(xué)好,只能全學(xué),然而很多內(nèi)容對(duì)于初學(xué)者而言很難理解!第三,系統(tǒng)地學(xué)習(xí)JavaScript應(yīng)根據(jù)知識(shí)點(diǎn)的難易及內(nèi)在聯(lián)系劃分階段:初級(jí)-進(jìn)階-高級(jí),這樣才能更好地學(xué)習(xí)JavaScript。最后 最好有內(nèi)行人指導(dǎo),什么內(nèi)容常用,什么內(nèi)容重點(diǎn)掌握等等。如果身邊沒(méi)有這樣的人,可以選擇報(bào)班學(xué)習(xí)。千鋒教育目前在18個(gè)城市擁有22個(gè)校區(qū),年培養(yǎng)優(yōu)質(zhì)人才20000余人,與國(guó)內(nèi)20000余家企業(yè)建立人才輸送合作關(guān)系,院校合作超600所
不是的,兩者有很大的差別。語(yǔ)法方面JavaScript的基本語(yǔ)法和對(duì)象體系,是模仿Java而設(shè)計(jì)的。但是,JavaScript沒(méi)有采用Java的靜態(tài)類(lèi)型。正是因?yàn)镴avaScript與Java有很大的相似性,所以這門(mén)語(yǔ)言才從一開(kāi)始的LiveScript改名為JavaScript?;旧?,JavaScript這個(gè)名字的原意是“很像Java的腳本語(yǔ)言”。千鋒官網(wǎng)每日更新最新軟件開(kāi)發(fā)基礎(chǔ)知識(shí)內(nèi)容,鞏固日常學(xué)習(xí)中的基礎(chǔ)技能。更有免費(fèi)的軟件開(kāi)發(fā)視頻教程幫助學(xué)員快速學(xué)習(xí)。 千鋒教育就有線(xiàn)上免費(fèi)的軟件開(kāi)發(fā)公開(kāi)課,。
在JavaScript語(yǔ)言中,函數(shù)是一種獨(dú)立的數(shù)據(jù)類(lèi)型,以及采用基于原型對(duì)象(prototype)的繼承鏈。這是它與Java語(yǔ)法最大的兩點(diǎn)區(qū)別。JavaScript語(yǔ)法要比Java自由得多。數(shù)據(jù)結(jié)構(gòu)部分則借鑒Java語(yǔ)言,包括將值分成原始值和對(duì)象兩大類(lèi)。另外,Java語(yǔ)言需要編譯,而JavaScript語(yǔ)言則是運(yùn)行時(shí)由解釋器直接執(zhí)行??傊?,JavaScript的原始設(shè)計(jì)目標(biāo)是一種小型的、簡(jiǎn)單的動(dòng)態(tài)語(yǔ)言,與Java有足夠的相似性,使得使用者(尤其是Java程序員)可以快速上手千鋒教育集團(tuán)目前已與國(guó)內(nèi)4000多家企業(yè)建立人才輸送合作,與500多所大學(xué)建立實(shí)訓(xùn)就業(yè)合作,每年為各大企業(yè)輸送上萬(wàn)名移動(dòng)開(kāi)發(fā)工程師,每年有數(shù)十萬(wàn)名學(xué)員受益于千鋒教育組織的技術(shù)研討會(huì)、技術(shù)培訓(xùn)課、網(wǎng)絡(luò)公開(kāi)課及免費(fèi)教學(xué)視頻。
猜數(shù)字
html
title猜數(shù)字/title
body
centerh2猜數(shù)字/h2/center
hr
script
var target=36;
var number=0;
do{
number=window.prompt("輸入數(shù)字",number);
if(number==null || number==target)
break;
if(numbertarget){
alert(number+"太大");
continue;
}
else if(number!=target){
alert(number+"太小");
continue;
}
}while(true)
if(number==null)
alert("不猜了!答案為:"+target)
else
alert("猜對(duì)了!答案為:"+target)
/script
/body
/html
Javascript繼承 一直想對(duì)Javascript再次做一些總結(jié),正好最近自己寫(xiě)了一個(gè)小型Js UI庫(kù),總結(jié)了一下Js的繼承機(jī)制,在網(wǎng)上也看了一些前輩們博客里的總結(jié),感覺(jué)分析不是特別全面。這里僅僅是把自己的學(xué)習(xí)體會(huì)拿出來(lái)分享一下,希望對(duì)大家學(xué)習(xí)Javascript有所幫助。 Javascript本身是從Perl語(yǔ)言的語(yǔ)法演變而來(lái)的,本質(zhì)上是腳本語(yǔ)言,隨著版本的更新逐漸加入的對(duì)面向?qū)ο蟮哪M。我認(rèn)為Js的面向?qū)ο竽M總體上做得還是不錯(cuò)的,因?yàn)槲覀儾荒苊娜魏我环N理念,不能純粹的為了OOP而OOP,我們需要抓住的是面向?qū)ο蟮暮锰幍降资鞘裁矗繛榱诉@些優(yōu)點(diǎn)去OOP,才是最明智的選擇,所以說(shuō)Js做得還不錯(cuò)。 Js的繼承在很多書(shū)里面細(xì)致的分了很多種類(lèi)型和實(shí)現(xiàn)方式,大體上就是兩種:對(duì)象冒充、原型方式。這兩種方式各有優(yōu)點(diǎn)和缺陷,這里我先列舉出來(lái),再?gòu)牡讓臃治鰠^(qū)別: (一)對(duì)象冒充
JScript code
functionA(name){
this.name = name;
this.sayHello = function(){alert(this.name+” say Hello!”);};
}
functionB(name,id){
this.temp = A;
this.temp(name); //相當(dāng)于new A();
deletethis.temp; //防止在以后通過(guò)temp引用覆蓋超類(lèi)A的屬性和方法
this.id = id;
this.checkId = function(ID){alert(this.id==ID)};
}
當(dāng)構(gòu)造對(duì)象B的時(shí)候,調(diào)用temp相當(dāng)于啟動(dòng)A的構(gòu)造函數(shù),注意這里的上下文環(huán)境中的this對(duì)象是B的實(shí)例,所以在執(zhí)行A構(gòu)造函數(shù)腳本時(shí),所有A的變量和方法都會(huì)賦值給this所指的對(duì)象,即B的實(shí)例,這樣子就達(dá)到B繼承了A的屬性方法的目的。之后刪除臨時(shí)引用temp,是防止維護(hù)B中對(duì)A的類(lèi)對(duì)象(注意不是實(shí)例對(duì)象)的引用更改,因?yàn)楦膖emp會(huì)直接導(dǎo)致類(lèi)A(注意不是類(lèi)A的對(duì)象)結(jié)構(gòu)的變化。 我們看到了,在Js版本更新的過(guò)程中,為了更方便的執(zhí)行這種上下文this的切換以達(dá)到繼承或者更加廣義的目的,增加了call和apply函數(shù)。它們的原理是一樣的,只是參數(shù)不同的版本罷了(一個(gè)可變?nèi)我鈪?shù),一個(gè)必須傳入數(shù)組作為參數(shù)集合)。這里就以call為例子,解釋一下用call實(shí)現(xiàn)的對(duì)象冒充繼承。
JScript code
functionRect(width, height){
this.width = width;
this.height = height;
this.area = function(){returnthis.width*this.height;};
}
functionmyRect(width, height, name){
Rect .call(this,width,height);
this.name = name;
this.show = function(){
alert(this.name+” with area:”+this.area());
}
}
關(guān)于Call方法,官方解釋?zhuān)赫{(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。 call (thisOb,arg1, arg2…) 這也是一種對(duì)象冒充的繼承,其實(shí)在call方法調(diào)用的時(shí)候發(fā)生的事情也是上下文環(huán)境變量this的替換,在myRect函數(shù)體中this肯定是指向類(lèi)myRect對(duì)象的實(shí)例了,然而用這個(gè)this作為上下文環(huán)境變量調(diào)用名字叫Rect方法,即類(lèi)Rect的構(gòu)造函數(shù)。于是此時(shí)調(diào)用Rect時(shí)候?qū)his的賦值屬性和方法都實(shí)際上是對(duì)一個(gè)myRect的對(duì)象進(jìn)行。所以說(shuō)盡管call和apply并不是僅僅為了繼承而新增的方法,但用它們可以模擬繼承。 對(duì)象冒充繼承就是這么一回事,它可以實(shí)現(xiàn)多重繼承,只要重復(fù)做這一套賦值的流程就可以了。不過(guò)目前真正大規(guī)模使用得并不多,為什么呢?因?yàn)樗幸粋€(gè)明顯的性能缺陷,這就要說(shuō)道OO的概念了,我們說(shuō)對(duì)象是成員+成員方法的集合,構(gòu)造對(duì)象實(shí)例的時(shí)候,這些實(shí)例只需要擁有各自的成員變量就可以了,成員方法只是一段對(duì)變量操作的可執(zhí)行文本區(qū)域而已,這段區(qū)域不用為每個(gè)實(shí)例而復(fù)制一份,所有的實(shí)例都可以共享?,F(xiàn)在回到Js利用對(duì)象冒充模擬的繼承里,所有的成員方法都是針對(duì)this而創(chuàng)建的,也就是所所有的實(shí)例都會(huì)擁有一份成員方法的副本,這是對(duì)內(nèi)存資源的一種極度浪費(fèi)。其它的缺陷比如說(shuō)對(duì)象冒充無(wú)法繼承prototype域的變量和方法就不用提了,筆者認(rèn)為前一個(gè)致命缺陷就已經(jīng)足夠。不過(guò),我們還是需要理解它,特別是父類(lèi)的屬性和方法是如何繼承下來(lái)的原理,對(duì)于理解Js繼承很重要。 (二)原型方式 第二種繼承方式是原型方式,所謂原型方式的繼承,是指利用了prototype或者說(shuō)以某種方式覆蓋了prototype,從而達(dá)到屬性方法復(fù)制的目的。其實(shí)現(xiàn)方式有很多中,可能不同框架多少會(huì)有一點(diǎn)區(qū)別,但是我們把握住原理,就不會(huì)有任何不理解的地方了??匆粋€(gè)例子(某一種實(shí)現(xiàn)):
JScript code
functionPerson(){
this.name = “Mike”;
this.sayGoodbye = function(){alert(“GoodBye!”);};
}
Person.prototype.sayHello = function(){alert(”Hello!”);};
functionStudent(){}
Student.prototype = newPerson();
關(guān)鍵是對(duì)最后一句Student原型屬性賦值為Person類(lèi)構(gòu)造的對(duì)象,這里筆者解釋一下父類(lèi)的屬性和方法是如何copy到子類(lèi)上的。Js對(duì)象在讀取某個(gè)對(duì)象屬性的時(shí)候,總是先查看自身域的屬性列表,如果有就返回否則去讀取prototype域(每個(gè)對(duì)象共享構(gòu)造對(duì)象的類(lèi)的prototype域所有屬性和方法),如果找到就返回,由于prototype可以指向別的對(duì)象,所以Js解釋器會(huì)遞歸的去查找prototype域指向?qū)ο蟮膒rototype域,直到prototype為本身,查找變成了一種循環(huán),就停止,此時(shí)還沒(méi)找到就成undefined了。 這樣看來(lái),最后一句發(fā)生的效果就是將父類(lèi)所有屬性和方法連接到子類(lèi)的prototype域上,這樣子類(lèi)就繼承了父類(lèi)所有的屬性和方法,包括name、sayGoodbye和sayHello。這里與其把最后一句看成一種賦值,不如理解成一種指向關(guān)系更好一點(diǎn)。這種原型繼承的缺陷也相當(dāng)明顯,就是繼承時(shí)父類(lèi)的構(gòu)造函數(shù)時(shí)不能帶參數(shù),因?yàn)閷?duì)子類(lèi)prototype域的修改是在聲明子類(lèi)對(duì)象之后才能進(jìn)行,用子類(lèi)構(gòu)造函數(shù)的參數(shù)去初始化父類(lèi)屬性是無(wú)法實(shí)現(xiàn)的,如下所示:
JScript code
functionPerson(name){
this.name = name;
}
functionStudent(name,id){
this.id = id;
}
Student.prototype = newPerson(this.name);
兩種繼承方式已經(jīng)講完了,如果我們理解了兩種方式下子類(lèi)如何把父類(lèi)的屬性和方法“抓取”下來(lái),就可以自由組合各自的利弊,來(lái)實(shí)現(xiàn)真正合理的Js繼承。下面是個(gè)人總結(jié)的一種綜合方式:
JScript code
functionPerson(name){
this.name = name;
}
Person.prototype.sayHello = function(){alert(this.name+“say Hello!”);};
functionStudent(name,id){
Person.call(this,name);
this.id = id;
}
Student.prototype = newPerson();
Student.prototype.show = function(){
alert(“Name is:”+ this.name+” and Id is:”+this.id);
}
總結(jié)就是利用對(duì)象冒充機(jī)制的call方法把父類(lèi)的屬性給抓取下來(lái),而成員方法盡量寫(xiě)進(jìn)被所有對(duì)象實(shí)例共享的prototype域中,以防止方法副本重復(fù)創(chuàng)建。然后子類(lèi)繼承父類(lèi)prototype域來(lái)抓取下來(lái)所有的方法。如想徹底理清這些調(diào)用鏈的關(guān)系,推薦大家多關(guān)注Js中prototype的constructor和對(duì)象的constructor屬性,這里就不多說(shuō)了。
在JavaScript中,繼承可以用四種方式實(shí)現(xiàn),
1、對(duì)象冒充
感覺(jué)這種方式利用了js中類(lèi)和函數(shù)的模糊性,同是function關(guān)鍵字申明方法,既可以說(shuō)他是函數(shù),也可以說(shuō)他是類(lèi),js太靈活了,下面的例子說(shuō)明下:
function ClassA(sColor){ this.color=sColor; this.sayColor=function(){ alert(this.color); } }function ClassB(sColor){ this.newMethod=ClassA;//把ClassA方法賦給newMethod. this.newMethod();//調(diào)用newMethod. delete this.newMethod;}
ClassB執(zhí)行ClassA方法便相當(dāng)于繼承了ClassA,在調(diào)用完畢后要?jiǎng)h除newMethod,因?yàn)楹罄m(xù)添加的屬性和方法如果和超類(lèi)同名,就會(huì)覆蓋超類(lèi)的相關(guān)屬性和方法。
利用這種繼承方式可以實(shí)現(xiàn)多重繼承,如:
多重繼承 function ClassD(sColor){ this.newMethod=ClassA;//把ClassA方法賦給newMethod, this.newMethod();//調(diào)用newMethod delete this.newMethod; this.newMethod=ClassB; this.newMethod(); delete this.newMethod;}
利用這種多重繼承方法有個(gè)弊端,如果ClassA和ClassB具有相同的屬性和方法,ClassB有較高的優(yōu)先級(jí)。
2、call方法和apply方法
由于第一種方法很流行,所以ECMAScript便function對(duì)象加入兩個(gè)新方法,call()和apply(),這兩中方法很相似,只有在傳參方面有所不同,
call()方法的第一個(gè)參數(shù)用作this的對(duì)象,例如:
Call方法 function ClassB(sColor,sName){ ClassA.call(this,sColor); this.name=sName; this.sayName=function(){ alert(this.name);
}
}
call方法還是調(diào)用了ClassA()方法,利用this傳遞進(jìn)去ClassB,為ClassB初始化,他僅僅是調(diào)用了ClassA()方法而已,如果你在ClassA之外為ClassA添加了方法(例如利用原型法),是不能繼承到ClassB的。
call()方法的第一個(gè)參數(shù)必須是this,可以有第二個(gè),第三個(gè),第四個(gè)....參數(shù)。
apply()方法與call()方法不同的是,將二個(gè),第三個(gè),第四個(gè)....參數(shù)用一個(gè)數(shù)組傳遞。例如:
function ClassB(sColor,sName,sSex){ var arr=new Arry(sColor,sName,sSex); ClassA.apply(this,arr);//傳遞數(shù)組 this.name=sName; this.sayName=function(){ alert(this.name); }}
可以將arguments作為參數(shù)傳遞給apply,但是ClassB的參數(shù)順序必須和ClassA一致。
3.原型鏈
利用prototype實(shí)現(xiàn)繼承,prototype對(duì)象是個(gè)模板,要實(shí)例的對(duì)象都是以這個(gè)模板為基礎(chǔ),它的任何屬性和方法都被傳遞給那個(gè)類(lèi)的所有實(shí)例,原型鏈利用這種功能來(lái)實(shí)現(xiàn)繼承機(jī)制。
如果利用原型方式實(shí)現(xiàn)繼承,實(shí)例如下:
原型鏈 function ClassA(){ } ClassA.prototype.color="red"; ClassA.prototype.sayColor=function(){ alert(this.color); } function ClassB(){ } ClassB.prototype=newClassA();
通過(guò)原型鏈,ClassA的所有屬性和方法傳遞給了ClassB,用prototype的確是方便很多。
注意的是調(diào)用ClassA的構(gòu)造函數(shù)是,沒(méi)有給它傳遞參數(shù),這是在原型鏈中的標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒(méi)有任何參數(shù)。如果構(gòu)造函數(shù)中有參數(shù)的話(huà)會(huì)怎樣呢?那樣便不能完全的繼承,只能繼承父類(lèi)通過(guò)prototype初始的屬性和方法,在構(gòu)造函數(shù)中初始的屬性和方法便不會(huì)繼承。
與對(duì)象冒充相似,子類(lèi)的所有屬性和方法都必須出現(xiàn)在prototype屬性被賦值之后,因?yàn)樵谒百x值的所有方法都會(huì)被刪除。為什么呢?因?yàn)閜rototype屬性被替換成了新的對(duì)象,原始對(duì)象的prototype屬性以不復(fù)存在了,例如:
Code function ClassB(){ } ClassB.prototype=new ClassA(); ClassB.prototype.name=""; ClassB.prototype.sayName=function(){ alert(this.name);
}
原型鏈的弊端是不支持多重繼承,需要記住的是,原型鏈會(huì)用另一個(gè)類(lèi)型的對(duì)象重寫(xiě)類(lèi)的prototype屬性。
3.混合方式
使用原型鏈方法實(shí)現(xiàn)繼承非常的方便,問(wèn)題是不能夠使用帶參數(shù)的構(gòu)造函數(shù),通常使用構(gòu)造函數(shù)來(lái)定義屬性是最常見(jiàn)而且是最好的方式,要怎么做才可以好呢?
將對(duì)象冒充和原型鏈法結(jié)合起來(lái)使用,用對(duì)象冒充繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對(duì)象的方法,用這種方式重寫(xiě)前面的例子,代碼如下:
function ClassA(sColor){ this.color=sColor; } ClassA.prototype.sayColor=function(){ alert(this.color); }; function ClassB(sColor,sName){ ClassA.call(this,sColor); this.name=sName; } ClassB.prototype=new ClassA(); ClassB.prototype.sayName=function(){ alert(this.name); }; function show() { var a=new ClassA("red"); var b=new ClassB("blue","lhy"); a.sayColor();//輸出red b.sayColor();//輸出blue b.sayName();//輸出lhy }
在此例子中,繼承由兩種方式實(shí)現(xiàn),既使用了call方法,又使用了原型鏈,在構(gòu)造函數(shù)中,用對(duì)象冒充繼承ClassA類(lèi)的sColor屬性,在接下來(lái)的代碼中利用原型鏈繼承ClassA的方法,這樣結(jié)合了對(duì)象冒充方法彌補(bǔ)了原型鏈法不能使用帶參的構(gòu)造函數(shù)的缺陷。
可以采用了node工具。
做一個(gè)基本的矢量數(shù)據(jù)處理工具,方便后期數(shù)據(jù)生產(chǎn)較為自動(dòng)化,選用node.js作為批量數(shù)據(jù)處理的腳本工具,暴露服務(wù)接口,前端調(diào)用,canvas按照?qǐng)D層要素渲染。
Rapha_l是一個(gè)小型JavaScript庫(kù),可以簡(jiǎn)化網(wǎng)絡(luò)上矢量圖形的工作。例如,如果要?jiǎng)?chuàng)建自己的特定圖表或圖像裁剪并旋轉(zhuǎn)窗口小部件,則可以使用此庫(kù)輕松輕松地實(shí)現(xiàn)它。Rapha_l使用SVGW3C建議書(shū)和VML作為創(chuàng)建圖形的基礎(chǔ)。這意味著您創(chuàng)建的每個(gè)圖形對(duì)象也是DOM對(duì)象,因此您可以附加JavaScript事件處理程序或稍后對(duì)其進(jìn)行修改。拉斐爾(Rapha_l)的目標(biāo)是提供一種適配器,使跨矢量瀏覽器的圖形矢量藝術(shù)兼容且容易。
如果你會(huì)JAVA,去搜索Android SDK,網(wǎng)上有教程教你怎么安裝,進(jìn)入以后可以編安卓程序(.apk)的,比JavaScript好用多了。