我正在尝试使用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类。
我认为至少应该保存已接受的答案。
答案 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)
对于某些内置插件,扩展类实例往往会回退到原始的内置类实例。这些示例包括扩展Promise
,Number
,String
,因为JavaScript(类型转换,await
关键字等)的工作方式。使用扩展的内置类涉及在每个点创建扩展类实例:
new ExtendedString(fooString + barString).extendedMethod();
ExtendedPromise.resolve(nativePromise).extendedMethod();
这很麻烦,可能无法扩展内置的目的。
由于扩展内置类prototype
是一种几乎从不合理的坏习惯,正确的方法是不扩展内置类,而是使用ponyfills,这只是帮助扩展了内置类的功能。
对于某些事情,这种方法有效。对于检查字符串长度等其他事情,这是不值得的,因为
!str.length
输入的字符少于
const isEmpty = require('...');
isEmpty(str);