我正在通过面向对象的Javascript前进,我不禁感到自己错过了某项练习的内容。因此,我在这里寻找的是如何改善代码或对构造函数的理解的指针。这是the challenge:
想象一下String()构造函数
不存在。创建一个构造函数
函数MyString()的行为类似于
String()尽可能接近。
您不得使用任何内置
字符串方法或属性,以及
记住String()不存在。
您可以使用此代码来测试您的
构造函数:
-
var s = new MyString('hello');
s.length(); s [0]; s.toString();
s.valueOf(); s.charAt(1);
s.charAt('2'); s.charAt('e');
s.concat('world!'); s.slice(1,3);
s.slice(0,-1); s.split('e);
s.split('l'); s.reverse();
这是我的回复,但在一个或两个帐户上失败了,但是我对它的实际结构更感兴趣。我完全不在基地了吗?是否可以查看浏览器实现的实际String构造函数进行比较?
function MyString(string){
a = string.split("");
this.length = a.length;
this.toString = function(){
return a.join("");
};
this.valueOf = function(){
if(a.length > 0 && string !== 0 && string !== false && string !== undefined){
return true;
} else {
return false;
}
};
this.charAt = function(index){
return a[index];
};
this.concat = function(addition){
return string + addition;
};
this.slice = function(begin, end){
var a2 = new Array();
if(end < 0){
end = parseInt(a.length) + end;
}
for(y = begin;y<end;y++){
a2 += a[y];
}
return a2;
};
this.split = function(splitter){
spPos = parseInt(a.indexOf(splitter));
var split1 = a.slice(0,spPos);
var split2 = a.slice(spPos + 1, a.length);
var joined = new Array();
return joined.concat(split1.join(""), split2.join(""));
};
this.reverse = function(){
var ar = a.reverse();
return ar.join("");
};
return this;
}
我要上床睡觉,但是我会起床并在早上做出回应。非常感谢您提供有关此问题的任何指导。
最佳答案
如前所述,有关类结构的快速说明。
您的类的编写方式应使所有方法都在构造函数内部。因此,当您初始化新类时,将重新生成所有方法。因此,如果页面上有多个MyString类的实例,那么这将不是最有效的技术。您应该考虑改用原型技术。因此,您的构造函数将变成:
function MyString(string){
a = string.split("");
this.length = a.length;
}
然后,您的方法在构造函数外部声明,因此每次创建MyString的新实例时都不会重新生成。
MyString.prototype.toString = function(){ return a.join(""); }
MyString.prototype.charAt = function(index){ return a[index]; }
关于javascript - 重写JS String构造函数:我要离开吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3888273/