大家好我正在学习Stoyan Stefanov的书中的Javascript。我坚持第4章练习4:
想象一下String()构造函数不存在。创建一个构造函数 函数MyString()尽可能接近String()。 您不能使用任何内置字符串方法或属性, 并记住String()不存在。您可以使用此代码 测试你的构造函数:
>>> var s = new MyString('hello');
>>> s[0];
"h"
我想不出一个实现“s [0]”的方法,至少不是凭借我现在的知识。
有什么想法吗?
由于
答案 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