初到宝地,请教各位同修一个JS的对象继承的问题。
 发布于 12 年前  作者 caicaicaicai  4592 次预览  最后一次回复是 12 年前  来自  

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

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

zengwenbing

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

PerterPon

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

zengwenbing

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

caicaicaicai

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