仿String()構造器函數 【總結】
需求
實現以下方法:
控制臺結果:
需求分析:
首先確定new調用的this和什麽對象綁定,如果跟默認返回的對象綁定肯定做不到 [ ] 這樣的訪問,所以要在構造器內部返回一個包裝過的數組
1.length,既然前提是沒有String()構造器函數,那就不能用字符串對象的length方法,所以首先要將接收的字符串包裝成數組。雖說不能用字符串對象的方法,但這裏還是用到了 ES5的 [ ] 中括號訪問法,為了將字符串中的每一個字符做成數組中的每一項,這樣length就可以直接使用數組本身有的。
2. [ ] 中括號訪問法,直接用數組的
3.toString() 方法內部實現就是調用數組的join();方法
4.valueOf() 方法同上
5.charAt() 方法,規定如果參數是數字或是字符串,只要它是由純數字組成的就應該返回正確的結果,如果包含非數字的字符就返回第一個字符。實現方式就是簡單判斷傳入的參 數,然後像使用數組一樣使用上面包裝過的字符串數組來返回正確的值。
6.concat() 方法,在內部調用toValue()方法,加上傳進來的參數,然後返回出去。
7.slice() 方法,要求返回第一個參數的字符和第二個參數-1的之間的字符;如果是負數就與將參數與字符串長度相加。
8.split() 方法,將傳入的參數作為分隔符,將字符串分割成數組。
實現思路:
第一步要確認this與什麽對象綁定,也就是構造器函數返回什麽對象,這一點很重要,不知道是不是屬於OOP的風格。
難點:
split怎麽做,如果只是匹配單個字符還容易,多字符匹配做起來顯得有點吃力。
難點解決方案:
第一步:檢測字符數組的每一項,如果與期望字符串的第一個匹配就進入第二步
第二步:用循環匹配後面的字符,如果有一個不相等就break出來
第三步:匹配判斷結束後( 不管是break過還是沒break過都要判斷 ),如果匹配結束後的循環索引等於期望字符串的長度,說明中途沒有被中斷過
第四步:記錄下這個沒有被中斷過的位置,然後將它對應的起始位置,也就是 i 保存到一個數組裏,再將這個數組保存到更大的數組裏。
涉及的新知識:
OOP
優化方向:
不知道可不可以用正則去優化。
備註:
OOP風格的js可能需要先想好this與什麽對象綁定,這個對象就像是身體,要先確定是什麽樣的身體才能根據它衍生出不同的功能。
仿String()構造器函數 【總結】