2 steve yanrun steve_yanrun 于 2016.02.15 18:32 提问

JS新建构造器实现内建String()的方法和属性

在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:

 var s = new MyString(“hello”);
s.length;  //5
s[0];  //"h"
s.toString();  //"hello"
s.charAt(1);  //"e"
s.charAt("e");  //"h"  (这个是怎么来的???)
s.slice(0,-1);  //"hell"
s.split("e");  //["h","llo"]
s.reverse();  //"olleh"

 题目提示用把字符串当做数组用for循环遍历,(但是用for循环不就会用到“.length”属性了吗?)请教大家,谢谢!

6个回答

fk002008
fk002008   2016.02.16 00:06
已采纳

这个和之前的MyArray是相同的思想,都是数据结构封装。
之前我给你说[]不好实现,原来是我理解偏差,非要设计成函数构造器调用模式就陷入进去了。
刚才我想想,其实这个[]不是自己实现的,利用数组才能完成。
所以数组是核心,既然js中一切是对象,那么数组也是,可以像函数一样添加别的属性和方法。
题目提示用把字符串当做数组用for循环遍历,(但是用for循环不就会用到“.length”属性了吗?)
在js以及python等语言中有一个 辅助的for循环 是 for-in循环
可以用来便利一个可迭代的对象,比如字符串,数组,列表,元组等数据对象
所以便利一个字符串可以使用for-in
图片说明
既然这样你可以用它把一个字符串转化成一个字符数组

var MyString = function(str){
... var list = [];
... for(var c in str){
..... list.push(c);
..... }
...
... list.toString = function(){
... var str = "";
... for(var p in list){
..... str = str+p;
..... }
... return str;
... }
...
... list.charAt = function(index){
... return list[index];
... }
return list;
... }

showbo
showbo   Ds   Rxr 2016.02.16 10:03

这种都是基础类型,你要全部重写基础类型自己开发个解释器好些。。。


    function MyString(s) {
        this.s = s;
        this.length = this.s.length;
    }
    MyString.prototype = {
        length: function () { return this.s.length },
        toString: function () { return this.s },
        charAt: function (index) { return this.s.charAt(index) },
        slice: function (s, e) { return this.s.slice(s, e) },
        split: function (s) { return this.s.split(s) },
        reverse: function () { return this.s.reverse()}
    }

    var s = new MyString('hello');
    console.log(s.length)
    //s[0],[]是操作符,js没提供操作符重载方法,而且不建议[]对字符串操作,ie7-不支持
    console.log(s.toString())
    console.log(s.charAt(1))
    console.log(s.charAt('h'))//charAt方法是数字,传递字符串内部会parseInt转为数字,传递的非数字为转为NaN,经测试charAt方法未NaN,undefined之类的参数好像返回都是第一个字符
    console.log(s.slice(0, -1))
    console.log(s.split("e"))
    console.log(s.reverse())
u013538542
u013538542   2016.02.15 19:20

var s = new MyString(“hello”);
for(var a = 0; a < s.length; a++){
console.log("s=" + s[a]);
}
需要用.length属性

fk002008
fk002008   2016.02.16 00:12

哦不好意思,一处写错了
... list.toString = function(){
... var str = "";
... for(var p in list){
..... str = str+p;
..... }
... return str;
... }

改成
list.toString = function(){
var str = "";
for(var i = 0 ; i < list.length; i++){
str = str+list[i];
}
return str;
}

steve_yanrun
steve_yanrun   2016.02.16 12:34

var MyString = function(str){
var list = [];
for(var i in str){
list[i] = str[i];
}

list.toString = function(){
var str = "";
for(var a=0;a<list.length;a++){
str = str+list[a];
}
return str;
};

list.valueOf = function(){
var str = "";
for(var a=0;a<list.length;a++){
str = str+list[a];
}
return str;
};

/*list.charAt = function(index){
return list[index];
};*/

list.concat = function(st){
return str+st;
};

list.slice = function(min,max){
if(min<max){
s = "";
for(var m=min;m<max;m++){
s += str[m];
}
return s;
}else if(max<0){
s = "";
for(var m=min;m<max+str.length;m++){
s += str[m];
}
return s;
}else{
return "error";
}
};

list.reverse = function(){
arr = [];
for(var i in str){
arr[i] = str[i];
}
arr = arr.reverse();
s = "";
for(var i=0;i<arr.length;i++){
s += arr[i];

}
return s;
}

list.split = function(s){
arr = [];
s_str = "";
var a = 0;
for(var i in str){

if(str[i] === s){
arr[a] = s_str;
a++;
s_str = "";
}else{
s_str += str[i];
continue;
}

}
arr[a] = s_str;

return arr;
}

return list;
};

var s = MyString("Hello");
s.split("e");
这道题我的代码如上,但是charAt("e")却不能通过,请大家再帮忙想想,有没有其他方法,或者帮忙检查下我的代码还需修改的地方,在不改变题目原意的情况下,有没有更好的代码,谢谢!

steve_yanrun
steve_yanrun   2016.02.16 12:38

代码:

 var MyString = function(str){
  var list = [];
  for(var i in str){
    list[i] = str[i];
  }

  list.toString = function(){
    var str = "";
    for(var a=0;a<list.length;a++){
      str = str+list[a];
    }
    return str;
  };

  list.valueOf = function(){
    var str = "";
    for(var a=0;a<list.length;a++){
      str = str+list[a];
    }
    return str;
  };

  /*list.charAt = function(index){
    return list[index];
  };*/

  list.concat = function(st){
    return str+st;
  };

  list.slice = function(min,max){
    if(min<max){
      s = "";
      for(var m=min;m<max;m++){
        s += str[m];
      }
      return s;
    }else if(max<0){
      s = "";
      for(var m=min;m<max+str.length;m++){
        s += str[m];
      }
      return s;
    }else{
      return "error";
    }
  };

  list.reverse = function(){
    arr = [];
    for(var i in str){
      arr[i] = str[i];
    }
    arr = arr.reverse();
    s = "";
    for(var i=0;i<arr.length;i++){
      s += arr[i];   
    }
    return s;
  }

  list.split = function(s){ 
    arr = [];
    s_str = "";
    var a = 0;
    for(var i in str){      
      if(str[i] === s){
        arr[a] = s_str;
        a++;
        s_str = "";
      }else{

        s_str += str[i];
        continue;
      }      
    }
    arr[a] = s_str;   
    return arr;
  }  
  return list;
};

var s = MyString("Hello");
s.split("e");
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!