如何正确继承String内置类

时间:2017-10-28 17:14:26

标签: javascript node.js inheritance ecmascript-6 es6-class

我正在尝试使用ES6类扩展内置的JS String类 即只是为了继承String。

但是,以下代码不起作用 +=运营商将myStr实际类型更改回String AFAIK,JS中没有运算符继承 那么,如何避免这种行为?

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'

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

UPD :我理解JS中没有+运算符重载,原始答案清楚地说明了。 但是,它根本没有说继承和ES6类。 我认为至少应该保存已接受的答案。

3 个答案:

答案 0 :(得分:1)

施工没有错。

这个问题是对" +"的能力的误解。运营商。运营商" +"在JS中只能生成字符串或数字,而不是自定义类。

其他本机类(如数组)在保留proto时具有连接的特定方法。

所以你也可以创建它们。

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);

但是,按照这个速度,您也可以构建一个接受字符串作为构造函数参数的简单类,并编写您的类而不继承本机。

答案 1 :(得分:0)

我的猜测是你应该将方法isEmpty添加到String.prototype中,否则它将无效。这就是OOJS继承的工作原理。

答案 2 :(得分:0)

对于某些内置插件,扩展类实例往往会回退到原始的内置类实例。这些示例包括扩展PromiseNumberString,因为JavaScript(类型转换,await关键字等)的工作方式。使用扩展的内置类涉及在每个点创建扩展类实例:

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

这很麻烦,可能无法扩展内置的目的。

由于扩展内置类prototype是一种几乎从不合理的坏习惯,正确的方法是不扩展内置类,而是使用ponyfills,这只是帮助扩展了内置类的功能。

对于某些事情,这种方法有效。对于检查字符串长度等其他事情,这是不值得的,因为

!str.length

输入的字符少于

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