初到宝地,请教各位同修一个JS的对象继承的问题。
发布于 7 年前 作者 caicaicaicai 2914 次浏览 最后一次编辑是 4 年前

我打算构造一个自己的 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 回复

看了LS的文章算是稍微明白了一点,但是LS能否解释下为什么第二种情况的输入为0呢?

String.prototype.length is not generic 因为xx.length,xx.charAt,xx.indexOf都属于String.prototype.length,当你console.log(String.prototype)返回的是一个{},这代码这些原型方法是最终的,不能被自定义的类所继承

第二段代码里面XString并没有显式地定义length属性,所以这里读的应该还是String的length属性吧?还是有点不大明白,能说得再清晰一点么?3Q

var xx = new String(‘xx’) console.log(xx.length) => 输出 2 这个.length是字符串的密封方法(不可继承的方法),所以当你自定义一个类去继承这个String类的时候,里面的length也是不可继承的,可能String定义里面根本不是 this.length = args.length

按照老外的文章的意思,ECMAScript 标准不允许直接继承 String, Array 的对象。最后给出的解决方案我觉得很绕,但是确实解决了这个问题。

回到顶部