高頻手寫題目

建議優(yōu)先掌握:
  • instanceof - 考察對(duì)原型鏈的理解
  • new - 對(duì)創(chuàng)建對(duì)象實(shí)例過程的理解
  • call/apply/bind - 對(duì)this指向的理解
  • 手寫promise - 對(duì)異步的理解
  • 手寫原生ajax - 對(duì)ajax原理和http請(qǐng)求方式的理解遣鼓,重點(diǎn)是get和post請(qǐng)求的實(shí)現(xiàn)
實(shí)現(xiàn)instanceOf
  • 思路:
  • 步驟1:先取得當(dāng)前類的原型,當(dāng)前實(shí)例對(duì)象的原型鏈
  • 步驟2:一直循環(huán)(執(zhí)行原型鏈的查找機(jī)制)
  • 取得當(dāng)前實(shí)例對(duì)象原型鏈的原型鏈(proto = proto.proto,沿著原型鏈一直向上查找)
  • 如果 當(dāng)前實(shí)例的原型鏈proto上找到了當(dāng)前類的原型prototype怠蹂,則返回 true
  • 如果 一直找到Object.prototype.proto == null抗愁,Object的基類(null)上面都沒找到锐朴,則返回 false
// 實(shí)例.__ptoto__ === 類.prototype
function myInstanceof(example, classFunc) {
    let proto = Object.getPrototypeOf(example); //返回指定對(duì)象的原型
    while(true) {
        if(proto == null) return false;

        // 在當(dāng)前實(shí)例對(duì)象的原型鏈上殷费,找到了當(dāng)前類
        if(proto == classFunc.prototype) return true;
        // 沿著原型鏈__ptoto__一層一層向上查
        proto = Object.getPrototypeof(proto); // 等于proto.__ptoto__
    }
}
new操作符做了這些事:
  • 創(chuàng)建一個(gè)全新的對(duì)象
  • 這個(gè)對(duì)象的proto要指向構(gòu)造函數(shù)的原型prototype
  • 執(zhí)行構(gòu)造函數(shù)追驴,使用 call/apply 改變 this 的指向
  • 返回值為object類型則作為new方法的返回值返回眉枕,否則返回上述全新對(duì)象
function myNew(fn, ...args) {
    let instance = Object.create(fn.prototype); //創(chuàng)建一個(gè)新對(duì)象恶复,使用現(xiàn)有的對(duì)象來提供新創(chuàng)建的對(duì)象的__proto__怜森。
    let res = fn.apply(instance, args); // 改變this指向

    // 確保返回的是一個(gè)對(duì)象(萬一fn不是構(gòu)造函數(shù))
    return typeof res === 'object' ? res: instance;
}
實(shí)現(xiàn)一個(gè)call方法
Function.prototype.myCall = function (context = window) {
  context .func = this;
  let args = Array.from(arguments).slice(1); //從一個(gè)類似數(shù)組或可迭代對(duì)象創(chuàng)建一個(gè)新的,淺拷貝的數(shù)組實(shí)例谤牡。
  let res = args.length > 1 ? context.func(...args) : context.func();
  delete context.func;
  return res;
}
實(shí)現(xiàn)apply方法
Function.prototype.myApply = function (context = window) {
  context.func = this;
  let res = arguments[1] ? context.func(...argumnets[1]) : context.func();
  delete context.func;
  return res;
}
實(shí)現(xiàn)一個(gè)bind方法
Function.prototype.myBind = function (context) {
  let cext = JSON.parse(JSON.stringify(context)) || window;
  cext .func = this;
  let args = Array.from(argumnets).slice(1);
  return function () {
    let allArgs= args .concat(Array.from(arguments));
    return allArgs.length ? cext.func(...allArgs) : cext.func();
  }
}
實(shí)現(xiàn)一個(gè)Promise
class myPromise {
  constructor (fn) {
    this.status = 'pending';
    this.value = undefined;
    this.reason = undefined;

    this.onFulfilled = [];
    this.onRejected = [];

    let resolve = value => {
        if(this.status  === 'pending') {
            this.status  = 'fulfilled';
            this.value = value;
            this.onFulfilled.forEach(fn => fn(value));
        }
    }
    let reject = value => {
      if(this.status === 'pending') {
          this.status = 'rejected';
          this.reason = value;
          this.onRejected.forEach(fn => fn(value))
      }
    }

    try {
        fn(resolve,reject);
    } catch (e) {
        reject(e)
    }
  }
  
  then (onFulfilled,onRejected) {
     if(this.status === 'fulfilled') {
          typeof onFulfilled === 'function' && onFulfilled(this.value);
      }
      if(this.staus === 'rejected') {
          typeof onRejected === 'function' && onRejected(this.reason);
      }
      if(this.status === 'pending') {
          typeof onFulfilled === 'function' && this.onFulfilled.push(this.value);
          typeof onRejected ===  'function' && this.onRejected.push(this.reason);
      }
  }
}

let p = new myPromise ((resolve,reject) => {
    console.log('我是promise的同步代碼');
    //異步任務(wù)
    $.ajax({
      url:'data.json',
      success:function (data) {
          resolve(data)
      },
      error:function (err) {
          reject(err);
      }
    })
})

p.then((res) => {
  console.log(res);
})
手寫原生AJAX
  • 步驟
  • 創(chuàng)建 XMLHttpRequest 實(shí)例
  • 發(fā)出 HTTP 請(qǐng)求
  • 服務(wù)器返回 XML 格式的字符串
  • JS 解析 XML副硅,并更新局部頁面
  • 不過隨著歷史進(jìn)程的推進(jìn),XML 已經(jīng)被淘汰拓哟,取而代之的是 JSON想许。
  • 了解了屬性和方法之后,根據(jù) AJAX 的步驟断序,手寫最簡單的 GET 請(qǐng)求流纹。
function ajax () {
  let xml = new XMLHttpRequest();
  xml.open('get','https://www.google.com',true);
  xml.onreadystatechange = () => {
    if(xml.readystate === 4) {
        if(xml.status > 200 && xml.status < 300 && xml.status = 304){
             alert(xml.responseText);
        }else {
            alert('Error' + xml.status);
        }
    }
  }
  xml.send();  
}
promise實(shí)現(xiàn)AJAX:
  • 返回一個(gè)新的Promise實(shí)例
  • 創(chuàng)建XMLHttpRequest異步對(duì)象
  • 調(diào)用open方法,打開url违诗,與服務(wù)器建立鏈接(發(fā)送前的一些處理)
  • 監(jiān)聽Ajax狀態(tài)信息
  • 如果xhr.readyState == 4(表示服務(wù)器響應(yīng)完成漱凝,可以獲取使用服務(wù)器的響應(yīng)了)
  • xhr.status == 200,返回resolve狀態(tài)
  • xhr.status == 404诸迟,返回reject狀態(tài)
  • xhr.readyState !== 4茸炒,把請(qǐng)求主體的信息基于send發(fā)送給服務(wù)器
function myAjax (url,method) {
  return new Promise((resovle,reject) => {  
      const xhr = new XMLHttpRequest();
      xhr.open(url,method,true);
      xhr.onReadystatechange = function () {
          if(xhr.readyState === 4 ){
              if(xhr.status >200 && xhr.status <300 && xhr.status ===304 ){
                  resolve(xhr.responseText);
              }else if(xhr.status === 404){
                reject(new Error('404'));
              }
          }else{
                reject('請(qǐng)求數(shù)據(jù)失敗阵苇!');
          }
      }
      xhr.send(null)
  })
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壁公,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绅项,更是在濱河造成了極大的恐慌紊册,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件快耿,死亡現(xiàn)場離奇詭異囊陡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掀亥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撞反,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搪花,你說我怎么就攤上這事遏片。” “怎么了撮竿?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吮便,是天一觀的道長。 經(jīng)常有香客問我倚聚,道長线衫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任惑折,我火速辦了婚禮授账,結(jié)果婚禮上枯跑,老公的妹妹穿的比我還像新娘。我一直安慰自己白热,他們只是感情好敛助,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋确,像睡著了一般纳击。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攻臀,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天焕数,我揣著相機(jī)與錄音,去河邊找鬼刨啸。 笑死堡赔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的设联。 我是一名探鬼主播善已,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼离例!你這毒婦竟也來了换团?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宫蛆,失蹤者是張志新(化名)和其女友劉穎艘包,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洒扎,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辑甜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年衰絮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袍冷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猫牡,死狀恐怖胡诗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淌友,我是刑警寧澤煌恢,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站震庭,受9級(jí)特大地震影響瑰抵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器联,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一二汛、第九天 我趴在偏房一處隱蔽的房頂上張望婿崭。 院中可真熱鬧,春花似錦肴颊、人聲如沸氓栈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授瘦。三九已至,卻和暖如春竟宋,著一層夾襖步出監(jiān)牢的瞬間提完,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工丘侠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氯葬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓婉陷,卻偏偏與公主長得像帚称,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秽澳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 說一下對(duì)HTML語義化的理解? 語義化就是選擇與語義相符合的標(biāo)簽闯睹,使代碼語義化,這樣不僅便于開發(fā)者進(jìn)行閱讀担神,...
    陳二狗想吃肉閱讀 2,159評(píng)論 3 16
  • JavaScript筆試部分 實(shí)現(xiàn)防抖函數(shù)(debounce) 防抖函數(shù)原理:在事件被觸發(fā)n秒后再執(zhí)行回調(diào)楼吃,如果在...
    程序源monster閱讀 299評(píng)論 1 1
  • 1、如何理解執(zhí)行上下文 JavaScript執(zhí)行上下文(context)主要指代碼執(zhí)行環(huán)境的抽象概念妄讯。執(zhí)行上下文分...
    焱_dd40閱讀 802評(píng)論 0 1
  • 本文中講述到的面試題: 說說對(duì)閉包的認(rèn)識(shí), 它解決了什么問題?跨域問題有哪些處理方式?for...in 和 for...
    寫代碼的胖猴子閱讀 1,103評(píng)論 0 5
  • 今天感恩節(jié)哎孩锡,感謝一直在我身邊的親朋好友。感恩相遇亥贸!感恩不離不棄躬窜。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評(píng)論 0 11