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

标签 javascript class

在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 方法。

最佳答案

is it possible to redefine the class's method later?

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

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

如果您想自动为所有新实例执行此操作(并且没有使用该方法的原型(prototype),您可以像@dystroy 的回答那样轻松地交换原型(prototype)),您将需要 decorate构造函数:

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);

关于javascript - 是否可以重新定义 JavaScript 类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21243790/

相关文章:

javascript - 为 SVG 对象提供相同或空白的 ID

javascript - 映射对象数组,然后使用过滤器删除重复项

javascript - 如何检查数组是否包含子数组中的元素

javascript - 替换函数与 if 语句组合

javascript - 如何传递表单数据并重定向到另一个页面

angular - 函数实现丢失或没有紧跟在声明之后,TypeScript 类

c++ - 是否可以使用循环对其所有类型执行类方法

c# - 创建一个以数字开头的属性

c++ - 如何在 main 之外的函数中创建对象?

Python 创建对象