《JavaScript 面向对象编程指南》中第4章,章节练习题4:
在String( )构造器不存在的情况下自定义一个 MyString( )的构造器函数。(由于 String()不存在,所以不能使用任何属于内建 String 对象的方法和属性),且要通过以下测试。
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"]
下面是我写的方法,本人第一次发帖子,如果有错或者需要有改进的地方,希望大家私信我,谢谢。
function MyString(str){
let i = 0;
let arr = [];
//这里之所以用 while 循环是因为我觉得如果用 for 循环的话,在获取循环终止条件会使用 .length;
//我认为字符串会被转化为 String( )对象,调用 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;
}
}
有些地方可能写的比较冗余,思路大概就是这个样子吧,如果有意见或建议欢迎讨论。