steve_yanrun
Ray-Yan
采纳率65.9%
2016-02-15 10:32 阅读 1.7k

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 lambda-fk 2016-02-15 16: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;
    ... }

    点赞 1 评论 复制链接分享
  • showbo GoCityPass新加坡曼谷通票 2016-02-16 02: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())
    
    点赞 2 评论 复制链接分享
  • u013538542 Johnny.Cheung 2016-02-15 11:20

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

    点赞 评论 复制链接分享
  • fk002008 lambda-fk 2016-02-15 16: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 Ray-Yan 2016-02-16 04: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 Ray-Yan 2016-02-16 04: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");
    
    点赞 评论 复制链接分享

相关推荐