Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确继承字符串内置类_Javascript_Node.js_Inheritance_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript 如何正确继承字符串内置类

Javascript 如何正确继承字符串内置类,javascript,node.js,inheritance,ecmascript-6,es6-class,Javascript,Node.js,Inheritance,Ecmascript 6,Es6 Class,我正在尝试使用ES6类扩展内置的JSStringclass。 即仅从字符串继承。 但是,下面的代码不起作用。 +=操作员更改myStr实际类型返回到String 好的,JS中没有运算符继承。 那么,如何避免这种行为呢? class QString extends String { isEmpty() { return this.length === 0; } } var testStr = new QString(); console.log(testStr.i

我正在尝试使用ES6类扩展内置的JS
String
class。
即仅从字符串继承。

但是,下面的代码不起作用。
+=
操作员更改
myStr
实际类型返回到
String

好的,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'
另外,我知道有机会添加一个新方法
String.prototype

但这是一种糟糕的做法

UPD:我理解JS中没有
+
操作符重载的地方,最初的答案说得很清楚。 然而,它根本没有提到继承和ES6类。
我认为至少应该保存已接受的答案。

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

对于某些内置类实例,扩展类实例倾向于退回到原始内置类实例。这些例子包括扩展的
Promise
Number
String
,因为JavaScript(类型转换,
wait
关键字等)的工作方式。使用扩展内置类涉及在每个点创建扩展类实例:

new ExtendedString(fooString + barString).extendedMethod();
ExtendedPromise.resolve(nativePromise).extendedMethod();
这很麻烦,可能会违背扩展内置程序的目的

由于扩展内置类
prototype
是一种糟糕的做法,几乎从来没有理由这样做,因此正确的方法是不扩展内置类,而是使用它,它只是扩展内置类功能的助手函数

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

!str.length
输入字符数少于

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

建筑没什么问题

该问题是对“+”运算符的能力的误解。JS中的运算符“+”只能生成字符串或数字,不能生成自定义类

其他本机类(如array)在保留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);

尽管如此,您还是可以构建一个简单的类,该类接受字符串作为构造函数参数,并在不继承本机的情况下编写类。

说(见下页):永远不要修改标准JavaScript对象的原型。你不同意W3C吗?@eraxillan这不是W3C,而是W3C学校,而且它因跛脚而臭名昭著,所以它不是一个可靠的来源。但有趣的是,W3Sukes是正确的,为了改变。@ W3Sura网站W3Sub根本没有与W3C的联系。我从C++来到JS,所以首先我尝试模仿强大的<代码> STD::String 使用JavaScript <代码> String 继承。因此,这是不可能的有用的方式?@eraxillan这是一个非常第一,通常是一个非常坏的想法,将一种编程语言转换成another@eraxillan遗憾的是,不,不是真的。在这里,您可以做的最好的事情是使现有的东西(参见
!str.length
)100%工作,包括可以多填充的新方法。对于更复杂的东西,ponyfills是一个不错的选择。我想这应该是为了解决这个问题,但它没有成功。所以,简短的回答是“你不能这样做”。知道了。我需要更多的了解JS方式,而不是模拟C++ STL:)。您可以这样做,但要了解如何在JS中组合对象。扩展native非常罕见,但肯定可以做到。例如,我为自定义连字处理阿拉伯语文本扩展了字符串。JS绝对不是C++的。我同意OP的观点,这个问题是关于在关注对象连接时遵循native对模式的引导,这是提议的副本莫名其妙地根本没有解决的问题。除了举例说明遇到的限制外,这个问题与运算符重载几乎没有关系。