各種手寫。

通過各種手寫,可以深入理解js的ES6的語法對(duì)應(yīng)的作用以及運(yùn)作規(guī)律劲室。


一伦仍、手寫new

1 創(chuàng)建一個(gè)新對(duì)象。
2 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)對(duì)象)很洋。
3 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性)充蓝。
4 返回新對(duì)象。

function myNew(){
let obj={};     //創(chuàng)建一個(gè)新對(duì)象
let Constructor=[].shift.call(arguments); //獲取第一個(gè)參數(shù)喉磁,為構(gòu)造函數(shù),同時(shí)這個(gè)操作也會(huì)彈出arguments類數(shù)組的第一個(gè)參數(shù)
obj.__proto__=Constructor.prototype; // 將這個(gè)新對(duì)象掛上構(gòu)造函數(shù)的原型鏈
let res=Constructor.call(obj,...arguments); //this指向obj
return typeof res==="object"?res:obj; //判斷是不是為對(duì)象谓苟,不是,則返空對(duì)象协怒。
}

或者

function myNew(Obj,...args){
  let obj = Object.create(Obj.prototype);//使用指定的原型對(duì)象及其屬性去創(chuàng)建一個(gè)新的對(duì)象
  Obj.call(obj,...args); // 綁定 this 到obj, 設(shè)置 obj 的屬性
  return obj; // 返回實(shí)例
}


二涝焙、手寫promise,promise.all孕暇,promise.race

1. promise簡(jiǎn)易版

詳細(xì)版

function myPromise(exector){
let self=this;
this.status="pending";
// 這里我們將value 成功時(shí)候的值 reason失敗時(shí)候的值放入屬性中
this.value=undefined;
this.reason=undefined;
// 存儲(chǔ)then中成功的回調(diào)函數(shù)
this.onResolvedCallbacks=[];
 // 存儲(chǔ)then中失敗的回調(diào)函數(shù)
this.onRejectedCallbacks=[];

//執(zhí)行成功時(shí)仑撞,
function resolve(value){
    if(self.status==="pending"){
    self.value=value;
    self.status="resolved";
    self.onResolvedCallbacks.forEach(fn=>fn());
    }
}

//執(zhí)行失敗
function reject(reason){
   if(self.status==="pending"){
    self.reason=reason;
    self.status="rejected";
    self.onRejectedCallbacks.forEach(fn=>fn());
    }
}

// 這里對(duì)異常進(jìn)行處理
     try {
        exector(resolve, reject);
    } catch(e) {
        reject(e)
    }
}
//then改造
myPromise.prototype.then=function(onFullfilled,onRejected){
  let self=this;
  if(this.status==="resoved")
        onFullfilled(self.value);
   if(this.status==="rejected")
        onRejected(self.reason);
   if(this.status==="pending"){
       // 保存回調(diào)函數(shù)
       this.onResolvedCallbacks.push(()=>{
             onFullfilled(self.value);
       })
        
        this.onRejectedCallbacks.push(()=>{
              onRejected(self.reason);
        })
    }
  return this;
}

省略版

class MyPromise {
  succeed = null
  fail = null
  state = 'pending' 

  constructor(fn) {
    fn(this.resolve.bind(this), this.reject.bind(this))
  }
  
  resolve(result) {
    setTimeout(() => { 
      this.state = 'fulfilled' 
      this.succeed(result)
    })
  }

  reject(reason) {
    setTimeout(() => {
      this.state = 'rejected' 
      this.fail(reason)
    })
  }

  then(succeed, fail) {
    this.succeed = succeed
    this.fail = fail
  }
}

2. promise.all

myPromise.all=function(parr){
  return new myPromise(function(resolve,reject){
    let result=[];
    let count=0;
    for(let i=0;i<parr.length;i++){
      parr[i].then(function(data){
          result[i]=data;
          count++;
          if(count===parr.length)  resolve(result);
      },function(error){
          reject(error);
      })
    }
  })
}

3. promise.race

myPromise.race=function(parr){
   return new myPromise((resolve,reject)=>{
     for(let i=0;i<parr.length;i++){
          parr[i].then(data=>{resolve(data)},error=>{reject(error)})
     }
  }
}

4. 實(shí)現(xiàn)catch方法

Promise.prototype.catch=(onRejected)=>{
          return this.then(null,onRejected);
})


三、promise封裝JSONP

function jsonp(url){
    return new Promise((resolve,reject)=>{
          const random="xiaokaiJSONCallbackName"+Math.random();
          window[random]=(data)=>{
                resolve(data);
          }   
          const script=document.createElement("script");
          script.src=`${url}?callback=${random}`;
          script.onload=()=> {
              script.remove();
          }
          script.onerror=()=>{
              reject();
        }
        document.body.appendChild(script);
   })  
}
//然后在需要傳的js文件里寫 window['{{xxx}}']('{{data}}')芭商,后臺(tái)讀取后根據(jù)查詢參數(shù)和數(shù)據(jù)寫新的數(shù)據(jù)于js派草。

四、手寫promisify函數(shù)

問題:
對(duì)于一個(gè)回調(diào)函數(shù)f(a,b,c,(err,res)=>{})铛楣,把他promisify化
栗子:const f1=promisify(f)
f1(a,b,c).then().catch()

function promisify(fn){
    return function(...args){
         return new promise((resolve,reject)=>{
              fn(...args,(err,res)=>{
                      err?reject(err):resolve(res);
              });
        })
    }
}

五近迁、手寫curry化(喵的被虐了)

function curry(fn){
    let len=fn.length;
    let args=[];
    return function curryFn(...partArgs){
        args=args.concat(partArgs);
        if(args.length<len){
              return curryFn;
        }else if(args.length>len{
              throw new Error("參數(shù)有問題!")
        }else{
                return  fn(...args);
        }
    }
}

六簸州、簡(jiǎn)易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用(喵的被虐了)

function createObj(){};
createObj.prototype={
      work(){return this};
      sleep(time){ setTimeOut(()=>{return this},time)};
      lunch(){return this};
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鉴竭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岸浑,更是在濱河造成了極大的恐慌搏存,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢洲,死亡現(xiàn)場(chǎng)離奇詭異璧眠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)读虏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門责静,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盖桥,你說我怎么就攤上這事灾螃。” “怎么了揩徊?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵腰鬼,是天一觀的道長(zhǎng)嵌赠。 經(jīng)常有香客問我,道長(zhǎng)熄赡,這世上最難降的妖魔是什么姜挺? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮本谜,結(jié)果婚禮上初家,老公的妹妹穿的比我還像新娘。我一直安慰自己乌助,他們只是感情好溜在,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著他托,像睡著了一般掖肋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赏参,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天志笼,我揣著相機(jī)與錄音,去河邊找鬼把篓。 笑死纫溃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的韧掩。 我是一名探鬼主播紊浩,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疗锐!你這毒婦竟也來了坊谁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤滑臊,失蹤者是張志新(化名)和其女友劉穎口芍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雇卷,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬓椭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了关划。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘融。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祭玉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情春畔,我是刑警寧澤脱货,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布岛都,位于F島的核電站,受9級(jí)特大地震影響振峻,放射性物質(zhì)發(fā)生泄漏臼疫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一扣孟、第九天 我趴在偏房一處隱蔽的房頂上張望烫堤。 院中可真熱鬧,春花似錦凤价、人聲如沸鸽斟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富蓄。三九已至,卻和暖如春慢逾,著一層夾襖步出監(jiān)牢的瞬間立倍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工侣滩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口注,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓君珠,卻偏偏與公主長(zhǎng)得像寝志,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葛躏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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