如何正确从string内置类inheritance

我想扩展使用ES6类的内置JS String类。
即只是从stringinheritance。

但是,下面的代码不起作用。
+=运算符将myStr实际types更改为String
AFAIK,JS中没有运算符inheritance。
那么,如何避免这种行为呢?

 class QString extends String { isEmpty() { return this.length === 0; } } var testStr = new QString(); console.log(testStr.isEmpty()); testStr += new QString("abc"); console.log(testStr.isEmpty()); // 'TypeError: testStr.isEmpty is not a function' 

PS我知道有机会添加一个新的方法String.prototype
但这是一个不好的做法。

UPD :我明白JS中没有+运算符重载,原来的答案很清楚。 但是,它完全没有提到inheritance和ES6类。 我想至less应该保存被接受的答案。

build设没有错。

这个问题是对“+”运算符能力的误解。 JS中的运算符“+”只能产生一个string或数字,而不是自定义的类。

其他本地类(如数组)具有特定的串联方法,同时保留原型。

所以你也可以创build这些。

 class QString extends String { isEmpty() { return this.length === 0; } concat(){ return new QString(this + Array.prototype.join.call(arguments, '')); } } var testQStr1 = new QString("abc"); var testQStr2 = new QString("as easy as"); var testQStr3 = new QString("123"); console.log(testQStr1); test1 = testQStr1.concat(testQStr2,testQStr3); console.log(test1); 

尽pipe如此,你也可以build立一个简单的类来接受一个string作为构造函数的参数,并且写下你的类而不inheritancenative。

我的猜测是,你应该将方法isEmpty添加到String.prototype,否则将无法正常工作。 这就是OOJSinheritance的工作原理。

对于一些内置的扩展类实例往往会回退到原来的内置类实例。 例子包括扩展的PromiseNumberString ,因为JavaScript(types转换, await关键字等)的工作方式。 使用扩展内置类需要在每个点上创build扩展类实例:

 new ExtendedString(fooString + barString).extendedMethod(); ExtendedPromise.resolve(nativePromise).extendedMethod(); 

这很麻烦,可能违背扩展内置的目的。

由于扩展内置类的prototype是不好的做法,几乎没有任何理由,正确的方法是不扩展内置的类,但使用ponyfills ,这只是帮助function,扩展内置类的function。

对于某些情况,这种方法是有效 对于其他的东西,如检查string的长度,这是不值得的,因为

 !str.length 

所需的字符数less于

 const isEmpty = require('...'); isEmpty(str);