今天遇到關(guān)于javascript原型的一道面試題,現(xiàn)分析下:
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),二連浩特企業(yè)網(wǎng)站建設(shè),二連浩特品牌網(wǎng)站建設(shè),網(wǎng)站定制,二連浩特網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,二連浩特網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
原題如下:
function
A(){
}
function
B(a){
this.a
=
a;
}
function
C(a){
if(a){
this.a
=
a;
}
}
A.prototype.a
=
1;
B.prototype.a
=
1;
C.prototype.a
=
1;
console.log(new
A().a);
console.log(new
B().a);
console.log(new
C(2).a);
分析:
console.log(new
A().a);//new
A()為構(gòu)造函數(shù)創(chuàng)建的對象,本身沒有a屬性,所以向它的原型去找,發(fā)現(xiàn)原型的a屬性的屬性值為1,故該輸出值為1;
console.log(new
B().a);//new
B()為構(gòu)造函數(shù)創(chuàng)建的對象,該構(gòu)造函數(shù)有參數(shù)a,但該對象沒有傳參,故該輸出值為undefined;
console.log(new
C(2).a);//new
C()為構(gòu)造函數(shù)創(chuàng)建的對象,該構(gòu)造函數(shù)有參數(shù)a,且傳的實參為2,執(zhí)行函數(shù)內(nèi)部,發(fā)現(xiàn)if為真,執(zhí)行this.a
=
2,故屬性a的值為2;
故這三個的輸出值分別為:1、undefined、2.
以上就是小編為大家?guī)淼年P(guān)于js原型的面試題講解的全部內(nèi)容了,希望對大家有所幫助,多多支持腳本之家~
求JavaScript部分 代碼講解?
if(/\((iPhone|iPad|iPod)/i.test(navigator.userAgent) == false){return;} //代表如果不是iPhone,iPad,iPod返回
document.addEventListener('mouseover', function(e){ //添加一個監(jiān)聽事件.當(dāng)鼠標(biāo)移上時執(zhí)行后邊的函數(shù)
var ele = e.target; //獲取當(dāng)前對象的打開放式
do{ //如果是A鏈接打開放式為在自己的窗口打開,如果是div返回,
if(ele.tagName == 'A'){
ele.target = '_self';
return;
}
if(ele.tagName == 'DIV'){return;}
ele = ele.parentNode; //然后把父節(jié)點賦值給ELE
}while(ele);
},false);
}
從0基礎(chǔ)到勉強能用,只求入門的話2-3個月綽綽有余,但是要精通的話肯定是需要花更多時間日積月累了,選擇培訓(xùn)的話是要參與一些項目聯(lián)練習(xí)的,因為JavaScript很多技巧不通過項目這樣比較大的歷練是用不上的。千鋒官網(wǎng)每日更新最新軟件開發(fā)基礎(chǔ)知識內(nèi)容,鞏固日常學(xué)習(xí)中的基礎(chǔ)技能。更有免費的軟件開發(fā)視頻教程幫助學(xué)員快速學(xué)習(xí)。 千鋒教育就有線上免費的軟件開發(fā)公開課,。
Web前端培訓(xùn)多長時間,只能說簡單入門在五到六個月,真正要達(dá)到精通級別的話,需要天賦跟經(jīng)驗的積累。正所謂,一入前端深似海,從此回首無邊界。活到老,學(xué)到老。只要步入了前端開發(fā)你就會發(fā)現(xiàn),前端真的是要一直不停的學(xué),不停的學(xué)。千鋒教育集團目前已與國內(nèi)4000多家企業(yè)建立人才輸送合作,與500多所大學(xué)建立實訓(xùn)就業(yè)合作,每年為各大企業(yè)輸送上萬名移動開發(fā)工程師,每年有數(shù)十萬名學(xué)員受益于千鋒教育組織的技術(shù)研討會、技術(shù)培訓(xùn)課、網(wǎng)絡(luò)公開課及免費教學(xué)視頻。
srcElement 是Dom事件中的事件最初指派到的元素。
比如有一個div,里面有一個按鈕。你響應(yīng)div的onclick事件,但實際上,你單擊的只是它內(nèi)部的按鈕,那么,srcElement指向的,就是那個按鈕。
srcElement只在IE中有效。
在Opera系列瀏覽器中對應(yīng)的屬性是target
給你一個IE下使用的例子。
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""
html xmlns=""
head
title無標(biāo)題頁/title
script type="text/javascript"
function onLoad()
{
document.getElementById( "myDiv" ).attachEvent( "onclick", on_myDivClick );
}
function onUnLoad()
{
document.getElementById( "myDiv" ).detachEvent( "onclick", on_myDivClick );
}
function on_myDivClick( e )
{
if( !e ) e = window.event;
alert( "event: " + e.type + ", fromElement = " + e.srcElement.id );
}
/script
/head
body onload="onLoad()" onunload="onUnLoad()"
div id="myDiv"
input type="button" id="btn1" value="button1" /
input type="button" id="btn2" value="button2" /
/div
/body
/html
首先我們來定義LockingPtr用到的Mutex類的骨架:
class Mutex
{
public:
void Acquire();
void Release();
...
};
為了能使用LockingPtr,你要用你操作系統(tǒng)用到的數(shù)據(jù)結(jié)構(gòu)和基本函數(shù)來實現(xiàn)Mutex。
LockingPtr用受控的變量的類型來作為模板。舉例來說,如果你想管理一個Widget,你使用一個LockingPtrWidget,這樣你可以用一個類型為volatile Widget的變量來初始化它。
LockingPtr的定義非常簡單。LockingPtr實現(xiàn)一個相對簡單的smart pointer。它目的只是把一個const_cast和一個臨界區(qū)集中在一起。
Template typename T
Class LockingPtr {
Public:
//構(gòu)造/析構(gòu)函數(shù)
LockingPtr(volatile T obj, Mutex mtx)
: pObj_(const_castT*(obj)),
pMtx_(mtx)
{ mtx.Lock(); }
~LockingPtr()
{ pMtx_-Unlock(); }
//模擬指針行為
T operator*()
{ return *pObj_; }
T* operator-()
{ return pObj_; }
private:
T* pObj_;
Mutex* pMtx_;
LockingPtr(const LockingPtr);
LockingPtr operator=(const LockingPtr);
};
盡管簡單,LockingPtr對寫出正確的多線程代碼非常有幫助。你應(yīng)該把被幾個線程共享的對象定義為volatile而且不能對它們使用const_cast——應(yīng)該始終使用LockingPtr自動對象。我們通過一個例子來說明:
假設(shè)你有兩個線程共享一個vectorchar對象
class SyncBuf {
public:
void Thread1();
void Thread2();
private:
typedef vectorchar BufT;
volatile BufT buffer_;
Mutex mtx_; //控制對buffer_的訪問
}; 軟件開發(fā)網(wǎng)
在一個線程函數(shù)中,你簡單地使用一個LockingPtrBufT來取得對buffer_成員變量的受控訪問:
void SyncBuf::Thread1() {
LockingPtrBufT lpBuf(buffer_, mtx_);
BufT::iterator I = lpBuf-begin();
For (; I != lpBuf-end(); I) {
...使用*i...
}
}
這些代碼既非常容易寫也非常容易懂——任何時候你需要用到buffer_,你必須創(chuàng)建一個LockingPtrBufT指向它。一旦你這樣做,你就能夠使用vecotr的所有接口。
非常好的事情是,如果你犯了錯,編譯器會指出來:
void SyncBuf::Thread2() {
//錯誤,不能對一個volatile對象調(diào)用begin()
BufT::iterator I = buffer_.begin();
//錯誤!不能對一個volatile對象調(diào)用end()
for (; I != lpBuf-end(); I) {
...使用*i...
}
}
你不能調(diào)用buffer_的任何函數(shù),除非你要么使用一個const_cast要么使用LockingPtr。區(qū)別是LockingPtr提供了一個有序的途徑來對volatile變量使用const_cast。
LockingPtr非常有表現(xiàn)力。如果你只需要調(diào)用一個函數(shù),你能夠創(chuàng)建一個無名臨時LockingPtr對象并直接使用它:
Unsigned int SyncBuf::Size() {
Return LockingPtrBufT(buffer_, mtx_)-size();
}
回到基本類型
我們已經(jīng)看到了volatile保護對象不被不受控制地訪問時是多么出色,也看到了LockingPtr提供了多么簡單和高效的方法來寫線程安全的代碼。讓我們回到基本類型,那些加了volatile后行為與用戶自定類型不同的類型
我們來考慮一個例子,多個線程共享一個類型為int的變量。
Class Count
{
public:
...
void Increment() { ctr_; }
void Decrement() { --ctr_; }
private:
int ctr_;
};
如果Increment和Decrement被不同線程調(diào)用,上面的代碼片段是有問題的。首先,ctr_必須是volatile,其次,即使象 ctr_那樣看上去是原子操作的函數(shù)實際上是一個三步操作。內(nèi)存本身沒有算術(shù)能力,當(dāng)遞增一個變量時,處理器:
* 讀取那個變量到寄存器
* 在寄存器中增加值
* 把結(jié)果寫回內(nèi)存
這個三步操作叫做RMW(Read-ModifyWrite 讀-改-寫)。在執(zhí)行一個RMW操作的“改”
操作時,為了讓其他處理器訪問內(nèi)存,大多數(shù)處理器會釋放內(nèi)存總線。
如果那時另一個處理器對同一個變量執(zhí)行一個RMW操作,我們就有了一個竟態(tài)條件;第二個寫操作覆蓋了第一個的結(jié)果。
你也能夠用LockingPtr避免這種情況:
class Counter
{
public:
...
void Increment() { *LockingPtrint(ctr_, mtx_); }
void Decrement() { --*LockingPtrint(ctr_, mtx_); }
private:
volatile int ctr_;
Mutex mtx_;
};
現(xiàn)在代碼正確了,但代碼質(zhì)量比較SyncBuf的代碼而言差了很多。為什么?因為在Counter里,如果你錯誤地直接訪問ctr_(沒有先對它加鎖)編譯器不會警告你。如果ctr_是volatile, ctr_也能編譯通過,但產(chǎn)生的代碼明顯是錯誤的。編譯器不再是你的幫手了,只有靠你自己注意才能避免這樣的竟態(tài)條件。
那你應(yīng)該怎么做?簡單地把你用到的基本數(shù)據(jù)包裝為更高層次的結(jié)構(gòu),對那些結(jié)構(gòu)用volatile。荒謬的是,盡管本來volatile的用途是用在內(nèi)建類型上,但實際上直接這樣做不是個好主意!
volatile成員函數(shù)
到目前為止,我們已經(jīng)有了包含有volatile數(shù)據(jù)成員的類,現(xiàn)在我們來考慮設(shè)計作為更大對象一部分的類,這些類也被多線程共享。在這里用volatile成員函數(shù)有很大幫助。
當(dāng)設(shè)計你的類時,你只對那些線程安全的成員函數(shù)加voaltile標(biāo)識。你必須假定外部代碼會用任何代碼在任何時刻調(diào)用volatile函數(shù)。不要忘記:volatile等于可自由用于多線程代碼而不用臨界區(qū),非volatile等于單線程環(huán)境或在一個臨界區(qū)內(nèi)。
例如,你定義一個Widget類,實現(xiàn)一個函數(shù)的兩個變化——一個線程安全的和一個快的,無保護的。
Class Widget
{
public:
void Operation() volatile;
void Operation();
...
private:
Mutex mtx_;
};
注意用了重載。現(xiàn)在Widget的用戶可以用同樣的語法來調(diào)用Operation,無論你為了獲得線程安全調(diào)用volatile對象的Operation還是為了獲得速度調(diào)用常規(guī)對象的Operation。但用戶必須小心地把被多線程共享的Widget對象定義為volatile。
當(dāng)實現(xiàn)一個volatile成員函數(shù)時,第一個操作通常是對this用一個LockingPtr加鎖。剩下的工作可以交給非volatile的對應(yīng)函數(shù):
軟件開發(fā)網(wǎng)
void Widget::Operation() volatile
{
LockingPtrWidget lpThis(*this, mtx_);
LpThis-Operation(); //調(diào)用非volatile函數(shù)
}
總結(jié)
當(dāng)寫多線程程序時,你可以用volatile得到好處。你必須遵守下面的規(guī)則:
* 定義所有的被共享的對象為volatile。
* 不要對基本類型直接用volatile
* 當(dāng)定義可被共享類時,使用volatile成員函數(shù)來表示線程安全。
如果你這樣做,而且如果你使用那個簡單的返型組件LockingPtr,你能夠?qū)懗鼍€程安
全的代碼而不用更多考慮竟態(tài)條件,因為編譯器能為你留心,會為你主動指出你錯誤的地方。
我參與的幾個使用volatile和LockingPtr的計劃獲得很好的效果。代碼清晰易懂。我記得碰到幾處死鎖,但我情愿遇到死鎖也不要竟態(tài)條件,因為死鎖調(diào)試起來容易得多。事實上沒有遇到任何問題是關(guān)于竟態(tài)條件的。
學(xué)習(xí)javascript沒HTMl基礎(chǔ)有點難度,建議你先熟悉html再學(xué)習(xí)。
JavaScript簡稱JS,之前的基礎(chǔ)就是HTML,HTML這門課程如果入門的話不是很難,刻苦點一月到兩月就能搞定,有HTML基礎(chǔ)的話,只要繼續(xù)刻苦一個月左右JS就能入門,但是想學(xué)到高深那就不容易了,js入門后在繼續(xù)學(xué)可以說也是有些難度的。總之先掌握HTML,這是一個基礎(chǔ),正如你說話要先從aoe開始一樣,HTML也很容易學(xué)的
HTML推薦書籍:深入淺出HTML和CSS
JS推薦書籍:《javascript入門經(jīng)典》
這些書籍可以幫助你怎么學(xué)習(xí),其實不止看書,你也可以看看視頻,多看視頻講解學(xué)習(xí)可以讓你少走很多彎路,節(jié)省不少時間。遇見問題,常百度一下,現(xiàn)在百度只有你想不到的,沒有你查不到的,沒有你要的答案,也能查到相關(guān)的,何況可以提問嘛……
人就是在不斷的問題中解決問題,發(fā)現(xiàn)新的問題,繼續(xù)解決問題,這樣自己的自學(xué)能力和技術(shù)能夠得到很大的提升,關(guān)鍵就是不懂一定馬上問,千萬不要隨便拖,這樣進(jìn)步才叫快……
還有補充一下,學(xué)習(xí)重在實踐,因為只有實踐你才能更好的發(fā)現(xiàn)自己的問題,一個問題解決了,一次不記得,下次繼續(xù)做的時候再手打一次,但是別抄之前自己寫過的代碼,除非你覺得自己這段代碼已經(jīng)掌握了,這樣為了節(jié)省時間才抄,否則還是練練手最好,,萬變不離其宗——熟能生巧……
如果你精通了,那就好辦了,一個網(wǎng)站可能就被你開發(fā)出來,然后就不愁找不到好工作了,至于你認(rèn)為學(xué)到什么地步算精通,這你自己在學(xué)習(xí)中就可以感受到自己的能力,說的夠多了,一時說不完,就這樣,最后祝你成功,嘎嘎嘎嘎……
分享標(biāo)題:javascript講解,Javascript教程
當(dāng)前鏈接:http://vcdvsql.cn/article44/dsdidhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、服務(wù)器托管、靜態(tài)網(wǎng)站、App設(shè)計、網(wǎng)站策劃、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)