面向对象的Javascript第4章练习4

时间:2014-01-21 03:29:29

标签: javascript

大家好我正在学习Stoyan Stefanov的书中的Javascript。我坚持第4章练习4:

  

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

>>> var s = new MyString('hello');
>>> s[0];
"h"

我想不出一个实现“s [0]”的方法,至少不是凭借我现在的知识。

有什么想法吗?

由于

4 个答案:

答案 0 :(得分:1)

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

    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

答案 1 :(得分:1)

这是我对此练习的解决方案:

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;
}

答案 2 :(得分:0)

上述情况略有变化......比任何事情更多的调整

var MyString = function (s) {
    for (var i = 0; i < s.length; i++){
        this[i] = s[i]
    }
    this.length = function() .....

您也不需要将其分配给评论建议的额外内容。这个[i]将根据传递给s

的字符串的长度创建

编辑:

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

答案 3 :(得分:0)

这是上述解决方案之一的另一种变体,但我没有使用for循环,而是使用while循环。我不经常使用while循环来处理这些事情,但它在这里工作得非常好。

添加length属性是可选的。

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