当前位置: 首页 > 面试题库 >

是否可以重新定义JavaScript类的方法?

终祯
2023-03-14
问题内容

在JavaScript中使用构造函数创建类时,以后是否可以重新定义类的方法?

例:

function Person(name)
{
    this.name = name;
    this.sayHello = function() {
        alert('Hello, ' + this.name);
    };
};

var p = new Person("Bob");
p.sayHello();   // Hello, Bob

现在,我想像这样重新定义sayHello

// This doesn't work (creates a static method)
Person.sayHello() = function() {
   alert('Hola, ' + this.name);
};

因此,当我创建另一个时Person,新sayHello方法将被称为:

var p2 = new Person("Sue");
p2.sayHello();   // Hola, Sue
p.sayHello();    // Hello, Bob

编辑:

我意识到我可以输入“ Hello”或“Hola”之类的参数sayHello来完成不同的输出。我还意识到我可以像这样简单地为p2分配一个新函数:

p2.sayHello = function() { alert('Hola, ' + this.name); };

我只是想知道是否可以重新定义类的方法,以便的新实例Person将使用新sayHello方法。


问题答案:

以后可以重新定义类的方法吗?

是。但是,您不得将新功能分配给Person构造函数的属性,而应分配给实例本身:

var p2 = new Person("Sue");
p2.sayHello();   // Hello, Sue
p2.sayHello = function() {
   alert('Hola, ' + this.name);
};
p2.sayHello();   // Hola, Sue

如果要对所有新实例自动执行此操作(并且尚未使用该方法的原型,可以轻松地像@dystroy的答案中那样进行交换),则需要装饰构造函数

Person = (function (original) {
    function Person() {
        original.apply(this, arguments);   // apply constructor
        this.sayHello = function() {       // overwrite method
            alert('Hola, ' + this.name);
        };
    }
    Person.prototype = original.prototype; // reset prototype
    Person.prototype.constructor = Person; // fix constructor property
    return Person;
})(Person);


 类似资料:
  • 来自以下来源: https://www.amazon.com/java-complete-reference-herbert-schildt/dp/0071808558 第8章:在继承中使用final 对于私有、静态、最终方法,应该使用早期(静态)方法绑定 所以正如我所认为的,这两个方法应该有不同的绑定类型。检查字节码: 在这里我看到了两个有害的指示。那么有什么方法可以确定类字节码使用了哪种绑定呢

  • 问题内容: 有没有不用典型继承就可以重新定义类或其某些方法的方法?例如: 我该怎么做才能代替?显然这是我想做的 这是我的两难选择:我更新了破坏我的代码的第三方库。我不想直接修改该库,因为将来的更新可能会再次破坏代码。我正在寻找一种无缝的方法来替换类方法。 我发现这个库说可以做到,但是我很警惕,因为它已经有4年的历史了。 编辑: 我应该澄清的是,由于框架的限制,我不能将类从重命名为to 或其他任何名

  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 我想知道是否有类似于对象实例的函数创建的东西,也许有类似的东西? 这段代码是写的,例如,它也不工作

  • 问题内容: Python 3.4引入了一个新模块,该模块向该语言添加了枚举类型。的文档提供了一个示例来演示如何扩展它: 此示例还演示了一个问题:在property方法中,定义了一个常量,该常量通常在类级别定义- 但是尝试在a级别内执行此操作只会将其添加为枚举的成员之一,因此,在方法内部定义。 如果该类想在其他方法中使用此常量,则也必须在其中定义它,这显然不是理想的选择。 有什么方法可以在中定义类常

  • 我想重新设置GlobalKTable的键(可能是在初始化它时,因为我相信它们只在创建之后才被读取)。 这可能吗? 我在一个Spring/JavaKafka Streams应用程序中有两个主题。第一个是不压缩的,第二个是。两者都使用Avro作为它们的键和值。 应用程序从第一个(非压缩)主题流式传输记录,并通过从压缩主题附加附加数据。压缩的主题已作为GlobalKTable引入应用程序,通过创建,并且