面向对象Javascript第4章练习4

面向对象Javascript第4章练习4,javascript,Javascript,大家好,我正在通过Stoyan Stefanov的书学习Javascript。我被困在第四章练习4中: 假设String()构造函数不存在。创建一个构造函数 函数MyString(),其作用与String()尽可能接近。 不允许使用任何内置字符串方法或属性, 记住String()并不存在。您可以使用此代码 测试您的构造函数: 我想不出实现“s[0]”的方法,至少用我现在的知识是不行的 有什么想法吗 感谢对象可以使用类似数组的语法定义其自身的属性。可以使用类似数组的语法访问字符串字符 fu

大家好,我正在通过Stoyan Stefanov的书学习Javascript。我被困在第四章练习4中:

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

我想不出实现“s[0]”的方法,至少用我现在的知识是不行的

有什么想法吗


感谢

对象可以使用类似数组的语法定义其自身的属性。可以使用类似数组的语法访问字符串字符

    function MyString (str) { 

this.length = 0; // string length

var i = 0;
while(str[i] != undefined) {
    this.length++;
    i++;
}

for (var i=0; i< this.length;i++)
    {
    this[i]=str[i];
    }
}
var s=new MyString('hello');
alert(s[0]); //h
函数MyString(str){
this.length=0;//字符串长度
var i=0;
while(str[i]!=未定义){
这个.length++;
i++;
}
for(var i=0;i
以上的细微变化……更像是一个调整

var MyString = function (s) {
    for (var i = 0; i < s.length; i++){
        this[i] = s[i]
    }
    this.length = function() .....
var MyString=函数{
对于(变量i=0;i
您也不需要像注释所建议的那样将其分配给任何额外的内容

编辑:


书中的部分问题是,不要使用现有的字符串方法,因此不能使用charAt,因此我将其切换为s[I]

以下是我针对该练习的解决方案:

function MyString(msg){

var array_msg = msg.split("");

array_msg.toString = function(){
    return array_msg.join("");
};

array_msg.valueOf = function(){
    return array_msg.toString();
};

array_msg.charAt = function(i){
    if(array_msg[i] === undefined){
        return array_msg[0];
    }else{return array_msg[i];}
};

array_msg.concat = function(msg2){
    return array_msg.join("")+" "+msg2;
};

array_msg.slice = function(d,f){
    var res = "";
    if(f<0){
        f = array_msg.length + f;
    }
    for(var i=d; i<f; i++){
        res += array_msg[i]
    }
    return res;
};

array_msg.split = function(el){
    return array_msg.toString().split(el);
};

return array_msg;
}
函数MyString(msg){
var数组_msg=msg.split(“”);
数组_msg.toString=函数(){
返回数组\u msg.join(“”);
};
数组_msg.valueOf=函数(){
返回数组_msg.toString();
};
数组_msg.charAt=函数(i){
if(数组_msg[i]==未定义){
返回数组_msg[0];
}else{return array_msg[i];}
};
数组_msg.concat=函数(msg2){
返回数组\u msg.join(“”+“”+msg2;
};
数组_msg.slice=函数(d,f){
var res=“”;

如果(f这是上述解决方案之一的另一个变体,但我使用的不是for循环,而是while循环。我通常不使用while循环来处理这类问题,但它在这里非常有效

添加长度属性是可选的

function MyString(str) {
    this.length = 0;    // Creating an optional length property
    this.value = str;
    var i = 0;
    while(str[i] != undefined) {
        this[i] = str[i];
        this.length++;
        i++;
    }
}

var name = new MyString('billy');
console.log(name.value);     // 'billy'
console.log(name[0]);        // 'b'
console.log(name.length);    // 5

谢谢!我缺少的是“this[i]=”。非常感谢muchWord.NP.PS,这是一本关于javascript的优秀免费电子书。他们让你给他们发电子邮件下载,但这完全值得。问题(在书中)清楚地说明不允许使用任何字符串方法,因此这不是一个解决方案。@alib_15你是对的。不确定我怎么会错过这个答案。这个新答案有效吗?不确定字符串的数组访问是否是一个遗漏。是的,我想你说得对。你能使字符串不可变吗?字符串不是一个字符数组吗?可以吗很明显,但要以此为出发点。你讨论过数组了吗?你是对的。但是现在学习一门语言的大多数人都不知道这一点(或者字符集的一个字符只是一个由位序列引用的符号)。这不是我的老前辈(我不是)…但特别是如果JS/C#/AS3/Ruby/Python是你的第一语言,你没有理由去考虑它。即使是没有字符串但有Char、操作符重载和StdLib(或类似)的语言,你不必知道该怎么开始了。谢谢。我的麻烦被否决了,接受的答案打破了问题的条款。CharAt是一个字符串方法。哦,好吧。
function MyString(str) {
    this.length = 0;    // Creating an optional length property
    this.value = str;
    var i = 0;
    while(str[i] != undefined) {
        this[i] = str[i];
        this.length++;
        i++;
    }
}

var name = new MyString('billy');
console.log(name.value);     // 'billy'
console.log(name[0]);        // 'b'
console.log(name.length);    // 5