《JavaScript 面向?qū)ο缶幊讨改稀分械?章,章節(jié)練習(xí)題4:
在String( )構(gòu)造器不存在的情況下自定義一個(gè) MyString( )的構(gòu)造器函數(shù)练慕。(由于 String()不存在,所以不能使用任何屬于內(nèi)建 String 對(duì)象的方法和屬性)纫骑,且要通過(guò)以下測(cè)試嫉你。
var s = new MyString('hello');
s.length; // 5
s[0]; // "h"
s.toString(); // "hello"
s.valueOf(); // "hello"
s.charAt(1); // "e"
s.charAt('2'); // "l"
s.charAr('e'); // "h"
s.concat(' world'); // "hello world"
s.slice(1,3); // "el"
s.slice(0,-1); // "hell"
s.split('e'); // ["h","llo"]
s.split('l'); // ["he","","o"]
下面是我寫的方法,本人第一次發(fā)帖子搅荞,如果有錯(cuò)或者需要有改進(jìn)的地方红氯,希望大家私信我,謝謝咕痛。
function MyString(str){
let i = 0;
let arr = [];
//這里之所以用 while 循環(huán)是因?yàn)槲矣X(jué)得如果用 for 循環(huán)的話痢甘,在獲取循環(huán)終止條件會(huì)使用 .length;
//我認(rèn)為字符串會(huì)被轉(zhuǎn)化為 String( )對(duì)象茉贡,調(diào)用 length 屬性后被清理
while(str[i]){
arr.push(str[i]);
i++;
}
this.length = arr.length;
for(let j = 0;j<arr.length;j++){
this[j] = arr[j];
}
this.toString = function() {
let str = '';
for(let i=0;i<arr.length;i++){
str = str + arr[i];
}
return str;
};
this.valueOf = function() {
return this.toString();
};
this.charAt = function(index) {
if(typeof(index) != 'number'){
index = index * 1;
if(typeof(index) != 'number'){
return 'Type Error';
}else{
return arr[index];
}
}else{
return arr[index];
}
}
this.concat = function(str){
return this.valueOf() + str;
}
this.slice = function(num1,num2){
num1 = num1<0?num1+arr.length:num1;
num2 = num2<0?num2+arr.length:num2;
if(num1>arr.length && num2>arr.length){
return 'Type Error';
}else{
if(num1 > num2){
let temp = num1;
num1 = num2;
num2 = temp;
}
let str = '';
let newArr = arr.slice(num1,num2);
for(let i=num1;i<newArr.length;i++){
str = str + arr[i];
}
return str;
}
}
this.split = function(str){
let strIndex = [0];
let newArr = [];
for(let i = 0;i<arr.length;i++){
if(arr[i] == str){
strIndex.push(i);
}
}
strIndex.push(arr.length);
for(let i=0;i<strIndex.length-1;i++){
if(i == 0){
newArr.push(arr.slice(strIndex[i],strIndex[i+1]));
}else{
newArr.push(arr.slice(strIndex[i]+1,strIndex[i+1]));
}
}
return newArr;
}
}
有些地方可能寫的比較冗余塞栅,思路大概就是這個(gè)樣子吧,如果有意見(jiàn)或建議歡迎討論块仆。