È ansible ridefinire il metodo di una class JavaScript?

Quando si utilizza una funzione di costruzione in JavaScript per creare una class, è ansible ridefinire il metodo della class in un secondo momento?

Esempio:

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

Ora mi piacerebbe ridefinire sayHello questo modo:

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

così quando creerò un’altra Person , verrà chiamato il nuovo metodo sayHello :

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

MODIFICARE:

Mi rendo conto che potrei inviare un argomento come “Ciao” o “Hola” per sayHello Ciao per realizzare il risultato diverso. Mi rendo anche conto che potrei semplicemente assegnare una nuova funzione a p2 come questa:

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

Mi sto solo chiedendo se posso ridefinire il metodo della class in modo che le nuove istanze di Person useranno il nuovo metodo sayHello .

è ansible ridefinire il metodo della class in un secondo momento?

Sì. Tuttavia, non è necessario assegnare la nuova funzione a una proprietà del costruttore Person , ma all’istanza stessa:

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

Se vuoi farlo automaticamente per tutte le nuove istanze (e non hai usato il prototipo per il metodo, che puoi facilmente scambiare come nella risposta di @ dystroy), dovrai decorare il costruttore:

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

Per avere una funzione diversa per p2, puoi semplicemente impostare la proprietà sayHello di p2:

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

Se utilizzi il prototipo, puoi anche modificarlo per tutte le istanze di Person (e comunque puoi sovrascriverlo per una persona specifica):

 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