有没有可能重新定义一个JavaScript类的方法?

当在JavaScript中使用构造函数来创build类时,是否有可能在之后重新定义类的方法?

例:

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

所以当我创build另一个Person ,新的sayHello方法将被调用:

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

编辑:

我意识到我可以发出像“你好”或“霍拉”这样的说法来表示你会完成不同的输出。 我也意识到我可以简单地给这个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); 

为了让p2具有不同的function,你可以设置p2的sayHello属性:

 p2.sayHello = function(){ alert('another one'); } p2.sayHello(); 

如果你使用原型,那么你也可以改变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