从Javascript面向对象编程Stoyan Stefanov书中模拟字符串split()

时间:2015-04-10 20:42:47

标签: javascript arrays string oop

我正在从Stoyan Stefanov的书中学习JS OOP。我在第4章的练习4中遇到了问题:

  

想象一下String()构造函数不存在。创建一个构造函数   函数MyString()尽可能接近String()。   您不允许使用任何内置字符串方法或属性,   并记住String()不存在。您可以使用此代码进行测试   你的构造函数:

下面是我尝试创建String split()方法。你能指导我如何使它发挥作用吗?



function MineString(string){
    this.lengthS = string.length;
    //this[1] = "test";
    for(var i = 0; i < string.length;i++){
        this[i] = string.charAt(i);    
    }

    this.toString = function(){
        return string;
    }

    this.split = function(char){
        var splitedArray = [];
        var foundedChar = [];
        var string2 = [];
        for (var i = 0; i < this.lengthS ; i++){
            foundedChar.push(string[i].indexOf(char)); 
        }
        for (var j = 0; j < foundedChar.length; j++){
            if(foundedChar[j] === -1){
                //splitedArray[0] += string.charAt(j);
                //splitedArray[j] = string.charAt(j);
                string2 += string.charAt(j);
                //splitedArray.push(string2);
                splitedArray[foundedChar.length] = string2;
            }else if (foundedChar[j] === 0){
                //splitedArray.push(string.charAt(j));
            }
        }
        
        return splitedArray;        
    }

}

var text = new MineString("hello");
text.split("e");
&#13;
&#13;
&#13;

所以text.split(&#34; e&#34;);应该显示如下内容:

&#13;
&#13;
var text = new MineString("hello");
    text.split("e");
    ["h","llo"]
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

您的拆分方法看起来有些过于复杂。我简化了它并重写了类的其他部分,以便它们遵守不使用字符串方法的任务。请参阅jsfiddle或以下代码。

新JS代码:

function MineString(str){
    this.str = str;

    this.addChar = function(c) {
        this.str += c;
    }

    this.length = function() {
        return this.str.length;
    }

    this.toString = function(){
        return this.str;
    }

    this.split = function(char){
        var out = [],
            current = new MineString(""),
            addCurrent = function() {
                if (current.length() > 0) {
                    out.push(current.toString());
                    current = new MineString("");
                }
            };

        for (i = 0; i < this.str.length; i++) {
            if (this.str[i] == char) {
                addCurrent();
            } else {
                current.addChar(this.str[i]);
            }
        }

        addCurrent();

        return out;      
    }

}

var text = new MineString("hello");
console.log(text.split("e"));

输出:

["h", "llo"]
相关问题