Javascript 如果原始基类方法在子类中被重写,如何访问它?
我正在用我自己的版本替换一些javascript的内置类,通过覆盖原始类来扩展它们和方法。但是,我有时在重写的方法中希望访问原始方法。然而,javascript只允许我在某些时候这样做,而在其他时候则不允许。这是非常不可预测的行为,我不知道这是怎么回事。似乎具有相同参数的同一方法每次调用时都有不同的结果 下面是一个javascript的内置类和方法的示例,我对其进行了修改,并获得了这种奇怪的行为:Javascript 如果原始基类方法在子类中被重写,如何访问它?,javascript,mongodb,Javascript,Mongodb,我正在用我自己的版本替换一些javascript的内置类,通过覆盖原始类来扩展它们和方法。但是,我有时在重写的方法中希望访问原始方法。然而,javascript只允许我在某些时候这样做,而在其他时候则不允许。这是非常不可预测的行为,我不知道这是怎么回事。似乎具有相同参数的同一方法每次调用时都有不同的结果 下面是一个javascript的内置类和方法的示例,我对其进行了修改,并获得了这种奇怪的行为: //从String类中的原始String类继承所有内容。 类字符串扩展字符串 { //重新定义原始
//从String类中的原始String类继承所有内容。
类字符串扩展字符串
{
//重新定义原始替换方法的行为。
替换()
{
//从原型中获取原始javascript的替换方法定义
//类的原型(基类)并将其附加到此
//对象的实例,然后运行它并传递它返回的任何内容
//回到打电话的人那里。
返回此;
}
}
//用自定义替换方法替换原始javascript的替换方法
//无处不在,包括字符串原语。
String.prototype.replace=String.prototype.replace;
//用自定义字符串类替换整个原始javascript的字符串类。
字符串=字符串;
//创建自定义字符串原语。
让a=“你好,斯塔基”;
//在自定义字符串原语中调用自定义替换方法。
a、 替换();
这段代码本质上做的是,它只做String
类中默认javascript的String
类和replace
方法所做的事情,只需通过我的自定义类和方法传递它。(像代理人一样)
请忽略缺少的一些东西,以及此代码毫无意义,因为它什么都不做。我只是简化了它,以便能向你展示这个问题。所以,我知道replace
方法应该有两个参数,但现在让我们忽略这一点。即使没有参数,它也能工作(replace
方法与toString
方法在没有参数时的工作原理相同)
在将STRING
类定义为STRING
类的扩展之后,我将replace
方法复制到STRING
原型,因为否则,只有STRING
和STRING
对象具有该方法,而不是STRING
原语
然后我创建测试原语,并对其调用我的自定义replace
方法
这应该会输出hello stacky
,因为如果在STRING
上调用replace
方法而不带参数,则与调用toString
方法相同
在replace
方法中,下列语句应为真,有时为真,有时为假:
this
,它返回STRING
对象\uuuuuuuuuuuuuuu
访问器。这应该返回STRING
对象的原型,这是我的自定义STRING
类STRING
对象的原型是STRING
类,所以第二个\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>应该返回STRING
类的原型。这应该是原始javascript的String
类
replace
方法。由于第二个\uuuu proto\uuuu
应该返回String
类,所以这个replace
方法应该是原始javascript的replace
方法定义replace
方法上调用call
方法,并将此
对象的上下文提供给该方法。这应该将原始javascript的replace
方法附加到此字符串,执行它,并将其结果返回到string
类中的自定义replace
方法中。
然后customreplace
方法将从被调用方法得到的任何内容返回给调用方。所以,输出应该等于hello stacky此
引用当前的字符串
对象this.\uuuu proto\uuuu
也指当前的字符串
对象this.\uuuuu proto\uuuuu.\uuuuu proto\uuuu
以某种方式也引用了当前的字符串
对象this.\uuuuu proto\uuuuu.\uuuuu proto\uuuu.\uuuuuuu proto\uuuu
指的是对象
super
而不是this从String
类访问replace
,但它仍然无法访问正确的方法
当它不起作用时,此代码返回typeError:this.\uuuuu proto\uuuu.\uuuu proto\uuu.replace未定义:.
我知道我可能错过了一些东西,但是,不知道是什么。或者MongoDB工作不正常
我真的不知道发生了什么事
我明白了,在我的代码中有一行:String=String
,这很棘手,因为String
是String
的子类,这可能会导致String
类被完全删除并替换为String
类,后者是它自己的父类。
根据this.\uuuuu proto\uuuuu.\uuuuu proto\uuuuu
STRING
类是它自己的父类,因为STRING
类的原型是另一个STRING
类,而STRING
类的原型是对象
类,而不是STRING
类
在这里的这个例子中,我删除了99%的代码,但是我保留了对这个问题很重要的部分。这段代码确实会产生与我的源代码相同的错误