手寫乙個Promise

2022-01-11 04:16:04 字數 1011 閱讀 3254

js物件導向

在js中一切皆物件,但js並不是一種真正的物件導向(oop)的語言,因為它缺少類(class)的概念。雖然es6引入了class和extends,使我們能夠輕易地實現類和繼承。但js並不存在真實的類,js的類是通過函式以及原型鏈機制模擬的,本小節的就來**如何在es5環境下利用函式和原型鏈實現js物件導向的特性

在開始之前,我們先回顧一下原型鏈的知識,後續new和繼承等實現都是基於原型鏈機制。很多介紹原型鏈的資料都能寫上洋洋灑灑幾千字,但我覺得讀者們不需要把原型鏈想太複雜,容易把自己繞進去,其實在我看來,原型鏈的核心只需要記住三點:

每個物件都有__proto__屬性,該屬性指向其原型物件,在呼叫例項的方法和屬性時,如果在例項物件上找不到,就會往原型物件上找

建構函式的prototype屬性也指向例項的原型物件

原型物件的constructor屬性指向建構函式

模擬實現new

首先我們要知道new做了什麼

建立乙個新物件,並繼承其建構函式的prototype,這一步是為了繼承建構函式原型上的屬性和方法

執行建構函式,方法內的this被指定為該新例項,這一步是為了執行建構函式內的賦值操作

返回新例項(規範規定,如果構造方法返回了乙個物件,那麼返回該物件,否則返回第一步建立的新物件)

// new是關鍵字,這裡我們用函式來模擬,new foo(args) <=> mynew(foo, args)

function mynew(foo, ...args)

function foo(name)

const newobj = mynew(foo, 'zhangsan')

console.log(newobj) // foo

console.log(newobj instanceof foo) // true

手寫乙個promise

promise a 規範 注 以下 沒有通過promises aplus tests的全部測試,但基本功能還是全的 測試結果 864 passing,8 failing 另外可以參考這個指南中的 promise實現 promise resolve 100 規範 class mypromise con...

手寫乙個Promise(1)

promise作為目前最受歡迎的js非同步程式設計解決方案,重要性不言而喻,今天就來實現乙個自己的promise。首先宣告類,新增幾個靜態屬性代表promise的狀態 class eswang 接著寫建構函式,主要是兩個類屬性,乙個代表狀態,使用剛剛的靜態屬性,乙個代表promise的值,初始為nu...

手寫乙個Promise(3)

then還沒有寫好。then的鏈式處理我們要對reject做一定的修改。if this status eswang.fufilled catch error 我們可以看到,fufilled狀態中,catch的reject使用的是新new的reject,而不是then中的函式引數。同樣需要這樣操作的還...