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