簡單點(diǎn)來說

站在用戶的角度思考問題,與客戶深入溝通,找到兩當(dāng)網(wǎng)站設(shè)計(jì)與兩當(dāng)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋兩當(dāng)?shù)貐^(qū)。
html 是構(gòu)建網(wǎng)頁內(nèi)容的基礎(chǔ),用html來寫入網(wǎng)頁內(nèi)容
css 是表現(xiàn)形式,就是控制這些 網(wǎng)頁內(nèi)容的樣子,比如某一個(gè)模塊用什么顏色文字、什么顏色背景、文字左右對齊、左右浮動等等這些表象性的東西
javascript是行為,它既可以控制html的內(nèi)容,比如修改網(wǎng)頁上的文字變換啊,標(biāo)簽隱藏顯示啊等等
也可以控制CSS的屬性,給網(wǎng)頁的樣子帶來變化,比如鼠標(biāo)經(jīng)過導(dǎo)航時(shí)顏色、背景的變化啊,網(wǎng)站換膚啊等等
換個(gè)比喻,html就像是人的身體;css就像是各種各樣的衣服,能給人帶來各種樣子上的變化;javascript就像是人的活動,可以改變身體的構(gòu)成,也可以改變各種衣服的樣子,三者結(jié)合就給網(wǎng)頁帶來了無窮的變化,成就無限可能
在說這個(gè)話題之前,我想先說幾句題外話:最近偶然碰到有朋友問我“hoisting”的問題。即在js里所有變量的聲明都是置頂?shù)模x值則是在之后發(fā)生的。可以看看這個(gè)例子:
var a = 'global';
(function () {
alert(a);
var a = 'local';
})();
大家第一眼看到這個(gè)例子覺得輸出結(jié)果是什么?‘global’?還是‘local’?其實(shí)都不是,輸出的是undefined,不用迷惑,我的題外話就是為了講這個(gè)東西的。
其實(shí)很簡單,看一看JavaScript運(yùn)行機(jī)制就會明白。我們可以把這種現(xiàn)象看做“預(yù)聲明”。但是如果稍微深究一下,會明白得更透徹。
這里其實(shí)涉及到對象屬性綁定機(jī)制。因?yàn)樗蠮avaScript函數(shù)都是一個(gè)對象。在函數(shù)里聲明的變量可以看做這個(gè)對象的“類似屬性”。對象屬性的綁定在語言里是有分“早綁定”和“晚綁定”之分的。
【早綁定】
是指在實(shí)例化對象之前定義其屬性和方法。解析程序時(shí)可以提前轉(zhuǎn)換為機(jī)器代碼。通常的強(qiáng)類型語言如C++,java等,都是早綁定機(jī)制的。而JavaScript不是強(qiáng)類型語言。它使用的是“晚綁定”機(jī)制。
【晚綁定】
是指在程序運(yùn)行前,無需檢查對象類型,只要檢查對象是否支持特性和方法即可。可以在綁定前對對象執(zhí)行大量操作而不受任何懲罰。
上面代碼出現(xiàn)的“預(yù)聲明”現(xiàn)象,我們大可用“晚綁定”機(jī)制來解釋。在函數(shù)的作用域中,所有變量都是“晚綁定”的。 即聲明是頂級的。所以上面的代碼和下面的一致:
var a = 'global';
(function () {
var a;
alert(a);
a = 'local';
})();
在alert(a)之前只對a作了聲明而沒有賦值。所以結(jié)果可想而知。
!-- 題外話到此結(jié)束 --
RT:本文要說的是,在JavaScript里,我所知道的幾種定義類和對象的方式:! -- 聲明:以下內(nèi)容大部分來自《JavaScript高級程序設(shè)計(jì)》,只是個(gè)人敘述方式不同而已 --
【直接量方式】
使用直接量構(gòu)建對象是最基礎(chǔ)的方式,但也有很多弊端。
var Obj = new Object;
Obj.name = 'sun';
Obj.showName = function() {
alert('this.name');
}
我們構(gòu)建了一個(gè)對象Obj,它有一個(gè)屬性name,一個(gè)方法showName。但是如果我們要再構(gòu)建一個(gè)類似的對象呢?難道還要再重復(fù)一遍?
NO!,我們可以用一個(gè)返回特定類型對象的工廠函數(shù)來實(shí)現(xiàn)。就像工廠一樣,流水線的輸出我們要的特定類型結(jié)果。
【工廠方式】
function createObj(name) {
var tempObj = new Object;
tempObj.name = name;
tempObj.showName = function () {
alert(this.name);
};
return tempObj;
}
var obj1 = createObj('obj_one');
var obj2 = createObj('obj_two');
這種工廠函數(shù)很多人是不把他當(dāng)做構(gòu)建對象的一種形式的。一部分原因是語義:即它并不像使用了運(yùn)算符new來構(gòu)建的那么正規(guī)。還有一個(gè)更大的原因,是因?yàn)檫@個(gè)工廠每次產(chǎn)出一個(gè)對象都會創(chuàng)建一個(gè)新函數(shù)showName(),即每個(gè)對象擁有不同的版本,但實(shí)際上他們共享的是同一個(gè)函數(shù)。
有些人把showName在工廠函數(shù)外定義,然后通過屬性指向該方法,可以避開這個(gè)問題:
代碼
可惜的是,這種方式讓showName()這個(gè)函數(shù)看起來不像對象的一個(gè)方法。
【構(gòu)造函數(shù)方式】
這種方式是為了解決上面工廠函數(shù)的第一個(gè)問題,即沒有new運(yùn)算符的問題。可是第二個(gè)問題它依然不能解決。我們來看看。
function Obj(name) {
this.name = name;
this.showName = function () {
alert(this.name);
}
}
var obj1 = new Obj('obj_one');
var obj2 = new Obj('obj_two');
它的好處是不用在構(gòu)造函數(shù)內(nèi)新建一個(gè)對象了,因?yàn)閚ew運(yùn)算符執(zhí)行的時(shí)候會自動創(chuàng)建一個(gè)對象,并且只有通過this才能訪問這個(gè)對象。所以我們可以直接通過this來對這個(gè)對象進(jìn)行賦值。而且不用再return,因?yàn)閠his指向默認(rèn)為構(gòu)造函數(shù)的返回值。
同時(shí),用了new關(guān)鍵字來創(chuàng)建我們想要的對象是不是感覺更“正式”了。
可惜,它仍然不能解決會重復(fù)生成方法函數(shù)的問題,這個(gè)情況和工廠函數(shù)一樣。
【原型方式】
這種方式對比以上方式,有個(gè)很大的優(yōu)勢,就是它解決了方法函數(shù)會被生成多次的問題。它利用了對象的prototype屬性。我們依賴原型可以重寫對象實(shí)例。
var Obj = function () {}
Obj.prototype.name = 'me';
Obj.prototype.showName = function () {
alert(this.name);
}
var obj1 = new Obj();
var obj2 = new Obj();
我們依賴原型對構(gòu)造函數(shù)進(jìn)行重寫,無論是屬性還是方法都是通過原型引用的方式給新建的對象,因此都只會被創(chuàng)建一次。可惜的是,這種方式存在兩個(gè)致命的問題:
1。沒辦法在構(gòu)建對象的時(shí)候就寫入想要的屬性,因?yàn)樵驮跇?gòu)造函數(shù)作用域外邊,沒辦法通過傳遞參數(shù)的方式在對象創(chuàng)建的時(shí)候就寫入屬性值。只能在對象創(chuàng)建完畢后對值進(jìn)行重寫。
2。致命問題在于當(dāng)屬性指向?qū)ο髸r(shí),這個(gè)對象會被多個(gè)實(shí)例所共享。考慮下面的代碼:
var Obj = function () {}
Obj.prototype.name = 'me';
Obj.prototype.flag = new Array('A', 'B');
Obj.prototype.showName = function () {
alert(this.name);
}
var obj1 = new Obj();
var obj2 = new Obj();
obj1.flag.push('C');
alert(obj1.flag); // A,B,C
alert(obj2.flag); //A,B,C
是的,當(dāng)flag屬性指向?qū)ο髸r(shí),那么實(shí)例obj1和obj2都共享它,哪怕我們僅僅改變了obj1的flag屬性,但是它的改變在實(shí)例obj2中任然可見。
面對這個(gè)問題,讓我們不得不想是否應(yīng)該把【構(gòu)造函數(shù)方式】和【原型方式】結(jié)合起來,讓他們互補(bǔ)。。。
【構(gòu)造函數(shù)和原型混合方式】
我們讓屬性用構(gòu)造函數(shù)方式創(chuàng)建,方法用原型方式創(chuàng)建即可:
var Obj = function (name) {
this.name = name;
this.flag = new Array('A', 'B');
}
Obj.prototype = {
showName : function () {
alert(this.name);
}
}
var obj1 = new Obj();
var obj2 = new Obj();
obj1.flag.push('C');
alert(obj1.flag); // A,B,C
alert(obj2.flag); //A,B
這種方式有效地結(jié)合了原型和構(gòu)造函數(shù)的優(yōu)勢,是目前用的最多,也是副作用最少的方式。
不過,有些追求完美的家伙還不滿足,因?yàn)樵谝曈X上還沒達(dá)到他們的要求,因?yàn)橥ㄟ^原型來創(chuàng)建方法的過程在視覺上還是會讓人覺得它不太像實(shí)例的方法(尤其對于傳統(tǒng)OOP語言的開發(fā)者來說。)
所以,我們可以讓原型活動起來,讓他也加入到構(gòu)造函數(shù)里面去,好讓這個(gè)構(gòu)造函數(shù)在視覺上更為統(tǒng)一。而這一系列的過程只需用一個(gè)判斷即可完成。
var Obj = function (name) {
this.name = name;
this.flag = new Array('A', 'B');
if (typeof Obj._init == 'undefined') {
Obj.prototype = {
showName : function () {
alert(this.name);
}
};
Obj._init = true;
}
}
如上,用_init作為一個(gè)標(biāo)志來判斷是否已經(jīng)給原型創(chuàng)建了方法。如果是那么就不再執(zhí)行。這樣其實(shí)在本質(zhì)上是沒有任何變化的,方法仍是通過原型創(chuàng)建,唯一的區(qū)別在于這個(gè)構(gòu)造函數(shù)看起來“江山統(tǒng)一”了。
但是這種動態(tài)原型的方式是有問題的,《JavaScript高級程序設(shè)計(jì)》里并沒有深究。創(chuàng)建第一個(gè)對象的時(shí)候會因?yàn)閜rototype在對象實(shí)例化之前沒來的及建起來,是根本無法訪問的。所以第一個(gè)對象是無法訪問原型方法的。同時(shí)這種方式在子類繼承中也會有問題。
關(guān)于解決方案,我會在下一文中說明。
其實(shí)就使用方便來說的話,個(gè)人覺得是沒必要做這個(gè)判斷的。。。呵呵 ^_^
編程語言(programming language),是用來定義計(jì)算機(jī)程序的形式語言。它是一種被標(biāo)準(zhǔn)化的交流技巧,用來向計(jì)算機(jī)發(fā)出指令。一種計(jì)算機(jī)語言讓程序員能夠準(zhǔn)確地定義計(jì)算機(jī)所需要使用的數(shù)據(jù),并精確地定義在不同情況下所應(yīng)當(dāng)采取的行動。[1]
最早的編程語言是在電腦發(fā)明之后產(chǎn)生的,當(dāng)時(shí)是用來控制提花織布機(jī)及自動演奏鋼琴的動作。在電腦領(lǐng)域已發(fā)明了上千不同的編程語言,而且每年仍有新的編程語言誕生。很多編程語言需要用指令方式說明計(jì)算的程序,而有些編程語言則屬于聲明式編程,說明需要的結(jié)果,而不說明如何計(jì)算。[1]
編程語言的描述一般可以分為語法及語義。語法是說明編程語言中,哪些符號或文字的組合方式是正確的,語義則是對于編程的解釋。有些語言是用規(guī)格文件定義,例如C語言的規(guī)格文件也是ISO標(biāo)準(zhǔn)中一部份,2011年后的版本為ISO/IEC 9899:2011,而其他語言(像Perl)有一份主要的編程語言實(shí)現(xiàn)文件,視為是參考實(shí)現(xiàn)。[1]
編程語言俗稱“計(jì)算機(jī)語言”,種類非常的多,總的來說可以分成機(jī)器語言、匯編語言、高級語言三大類。電腦每做的一次動作,一個(gè)步驟,都是按照已經(jīng)用計(jì)算機(jī)語言編好的程序來執(zhí)行的,程序是計(jì)算機(jī)要執(zhí)行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計(jì)算機(jī)一定要通過計(jì)算機(jī)語言向計(jì)算機(jī)發(fā)出命令。 目前通用的編程語言有兩種形式:匯編語言和高級語言。
所以說javascript 肯定是編程語言。
分享題目:javascript語義,javascript含義
本文URL:http://chinadenli.net/article6/dsgogog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、域名注冊、營銷型網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容