一尘不染

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

javascript

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


阅读 407

收藏
2020-05-01

共1个答案

一尘不染

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

是。但是,您不得将新功能分配给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);
2020-05-01