初到宝地,请教各位同修一个JS的对象继承的问题。
我打算构造一个自己的 XString 对象,用来替代内置的 String。
var MyString = function(arg) {
this.length = arg.length;
}
var XString = function(gender) {
MyString.apply(this, arguments);
}
XString.prototype = new MyString('xxx');
XString.prototype.constructor = XString; // fix constructor property
var foo = new XString('male');
console.log(foo.length); // 4
这是没有问题的。 如果把 MyString 换成 String 就会出问题!
var XString = function(gender) {
String.apply(this, arguments);
}
XString.prototype = new String('xxx');
XString.prototype.constructor = XString; // fix constructor property
var foo = new XString('male');
console.log(foo.length); // 0
6 回复
String.prototype.length is not generic 因为xx.length,xx.charAt,xx.indexOf都属于String.prototype.length,当你console.log(String.prototype)返回的是一个{},这代码这些原型方法是最终的,不能被自定义的类所继承
var xx = new String(‘xx’) console.log(xx.length) => 输出 2 这个.length是字符串的密封方法(不可继承的方法),所以当你自定义一个类去继承这个String类的时候,里面的length也是不可继承的,可能String定义里面根本不是 this.length = args.length
按照老外的文章的意思,ECMAScript 标准不允许直接继承 String, Array 的对象。最后给出的解决方案我觉得很绕,但是确实解决了这个问题。