需求
实现以下方法:
控制台结果:
需求分析:
首先确定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与什么对象绑定,这个对象就像是身体,要先确定是什么样的身体才能根据它衍生出不同的功能。
原文地址:https://www.cnblogs.com/mflnhg/p/9609994.html