自定义MyString()

在String构造器不存在的情况下,自定义一个MyString()的构造器函数
function MyString(str){
    var index=0;
    this._value=''+str;
    while(str[index]!==undefined){
        this[index]=str[index];
        index++;
    }
    this.length=index;
}
MyString.prototype={
    constructor: MyString,
    valueOf: function valueOf() {
        return this._value;
    },
    toString: function toString() {
        return this._value;
    },
    charAt: function charAt(n) {
        // return this._value[n];
        return this._value[parseInt(n,10)||0];
    },
    indexOf: function indexOf() {

    },
    concat: function concat() {
        var prim=this._value;
        for (var i = 0; i < arguments.length; i++) {
            prim+=arguments[i];
        };
        return prim;
    },
    slice: function slice(start, end){
        var result='',original=this.valueOf();
        if(start===undefined){
            return original;
        }
        if(start>this.length){
            return result;
        }
        if(start<0){
            start=this.length-start;
        }
        if(end===undefined||end>this.length){
            end=this.length;
        }
        if(end<0){
            end=this.length+end;
        }
        //end of validation,actual slicing loop now
        for(var i=start;i<end;i++){
            result+=original[i];
        }
        return result;
    },
    split: function split(re){
        var index=0,
            result=[],
            original=this.valueOf(),
            match,
            pattern='',
            modifiers='g';
        if(re instanceof RegExp){
            pattern=re.source;
            modifiers+=re.multiline?'m':'';
            modifiers+=re.ignoreCase?'i':'';
        } else {
            //not a regexp,probably a string,we'll convert it
            pattern=re;
        }
        re=RegExp(pattern,modifiers);
        /*
            思路:
            1、先判断origunal中是否存在要匹配的模板内容,
                没有,直接返回[],
                有,转到2
            2、将匹配到的字符索引,传给slice方法的第二个参数,截取第一段
                new MyString(match[0]).length获得匹配字符串的个数,
                索引加上这个个数便跳过这个索引,截取第二段,......以此类推,
                最后跳出循环,通过result.push(this.slice(index));截取最后一段
            3、  如果字符串中只有一个匹配的模板,即只能分成两个数组,
                则循环执行一次后跳出循环,push第二段,return,完毕
            要点:exec()这个方法每次执行都是在上一次索引的基础上往后找,返回结果为一个由匹配到的字符串组成的数组   
        */
        while(match=re.exec(original)){
            result.push(this.slice(index, match.index));
            index=match.index+new MyString(match[0]).length;
        }
        result.push(this.slice(index));
        return result;
    },
    //利用数组本身的reverse()方法
        reverse: function reverse(){
        return this.valueOf().split('').reverse().join('');
    }
};

测试
var s=new MyString('hello');
s.length;
5
s[0]
"h"
s.toString()
"hello"
s.valueOf()
"hello"
s.charAt(2)
"l"
s.charAt('e')
"h"
s.concat(' world')
"hello world"
s.slice(1,3);
"el"
s.slice(0,-1)
"hell"
s.split('l')
["he", "", "o"]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值