简体   繁体   中英

Object Oriented Javascript Chapter 4 Exercise 4

Hi all I'm learning Javascript with the Stoyan Stefanov's book. I'm stuck on Chapter 4 Exercise 4:

Imagine the String()constructor didn't exist. Create a constructor function MyString()that acts like String()as closely as possible. You're not allowed to use any built-in string methods or properties, and remember that String()doesn't exist. You can use this code to test your constructor:

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

I can't think on a way to achieve "s[0]", at least not with the knowledge I have now.

Any thoughts?

Thanks

Objects can have properties of themselves defined using array like syntax. String chars can be accessed with array like syntax.

    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

here is my solution for this exercice :

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

A slight variation of the above...more of a tweak than anything

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

You also don't need to assign it to anything as extra as the comment suggests. this[i] will be created for the length of the string passed to s

EDIT:

Part of the question in the book says not to use existing string methods so can't use charAt so I've switched it to s[I]

This is another variation of one of the above solutions but instead of using a for loop I am using a while loop. I don't usually use while loops for these kinds of things but it worked really well here.

Adding the length property is optional.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM