Javascript 如果原始基类方法在子类中被重写,如何访问它?

Javascript 如果原始基类方法在子类中被重写,如何访问它?,javascript,mongodb,Javascript,Mongodb,我正在用我自己的版本替换一些javascript的内置类,通过覆盖原始类来扩展它们和方法。但是,我有时在重写的方法中希望访问原始方法。然而,javascript只允许我在某些时候这样做,而在其他时候则不允许。这是非常不可预测的行为,我不知道这是怎么回事。似乎具有相同参数的同一方法每次调用时都有不同的结果 下面是一个javascript的内置类和方法的示例,我对其进行了修改,并获得了这种奇怪的行为: //从String类中的原始String类继承所有内容。 类字符串扩展字符串 { //重新定义原始

我正在用我自己的版本替换一些javascript的内置类,通过覆盖原始类来扩展它们和方法。但是,我有时在重写的方法中希望访问原始方法。然而,javascript只允许我在某些时候这样做,而在其他时候则不允许。这是非常不可预测的行为,我不知道这是怎么回事。似乎具有相同参数的同一方法每次调用时都有不同的结果

下面是一个javascript的内置类和方法的示例,我对其进行了修改,并获得了这种奇怪的行为:

//从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
    方法中。 然后custom
    replace
    方法将从被调用方法得到的任何内容返回给调用方。所以,输出应该等于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%的代码,但是我保留了对这个问题很重要的部分。这段代码确实会产生与我的源代码相同的错误