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

tro*_*man 3 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
Run Code Online (Sandbox Code Playgroud)

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

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

所以当我创建另一个时Person,sayHello将调用新方法:

var p2 = new Person("Sue");
p2.sayHello();   // Hola, Sue
p.sayHello();    // Hello, Bob
Run Code Online (Sandbox Code Playgroud)

编辑:

我意识到我可以发送一个像"Hello"或"Hola"这样的参数sayHello来完成不同的输出.我也意识到我可以简单地为p2分配一个新函数,如下所示:

p2.sayHello = function() { alert('Hola, ' + this.name); };
Run Code Online (Sandbox Code Playgroud)

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

Den*_*ret 8

要为p2设置不同的函数,只需设置sayHellop2 的属性即可:

p2.sayHello = function(){ 
    alert('another one');
}
p2.sayHello(); 
Run Code Online (Sandbox Code Playgroud)

如果你使用原型,那么你也可以为所有Person实例更改它(你仍然可以为特定的人覆盖它):

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

var p = new Person("Bob");

// let's set a specific one for p2
p2.sayHello = function(){ 
    alert('another one');
}

// now let's redefine for all persons (apart p2 which will keep his specific one)
Person.prototype.sayHello = function(){ 
    alert('different!');
}

p.sayHello();  // different!
p2.sayHello(); // another one
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 8

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

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

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

如果你想自动为所有新实例执行此操作(并且没有使用该方法的原型,您可以像@ 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);
Run Code Online (Sandbox Code Playgroud)