Se avete fatto Object Oriented Programming in JavaScript, si sa che si può creare una classe come segue:
Person = function(id, name, age){
this.id = id;
this.name = name;
this.age = age;
alert('A new person has been accepted');
}
Finora la nostra persona di classe ha solo due proprietà e abbiamo intenzione di dargli alcuni metodi. Un modo pulito per farlo è per usare il suo oggetto "prototipo". A partire da JavaScript 1.1, l'oggetto prototipo è stato introdotto in JavaScript. Questo è un oggetto incorporato che semplifica il processo di aggiunta di proprietà e metodi personalizzati a tutte le istanze di un oggetto. Aggiungiamo 2 metodi per la nostra classe utilizzando il suo oggetto 'prototipo' come segue:
Person.prototype = {
/** wake person up */
wake_up: function() {
alert('I am awake');
},
/** retrieve person's age */
get_age: function() {
return this.age;
}
}
ora abbiamo definito la nostra classe Person. Cosa succede se volessimo definire un'altra classe chiamata Manager che eredita alcune proprietà da Persona. Non ha senso ridefinire tutte queste proprietà quando definiamo la nostra classe Manager, possiamo semplicemente impostarla per ereditare dalla classe Person. JavaScript non hanno costruito in eredità ma possiamo usare una tecnica per implementare l'ereditarietà come segue:
Inheritance_Manager = {};
// creiamo una classe di eredità manager (il nome è arbitrario)
Ora diamo la nostra classe eredità un metodo chiamato extend che prende gli argomenti baseClass e sottoclassici. All'interno del metodo extend, creeremo una classe interna chiamata inheritance function inheritance() {}. Il motivo per cui stiamo usando questa classe interna è per evitare confusione tra i prototipi di baseClass e di sottoclasse. Quindi il prototipo della nostra classe di ereditarietà punta al prototipo di baseClass con il seguente codice: inheritance.prototype = baseClass. prototipo; Quindi copiamo il prototipo di ereditarietà nel prototipo di sottoclasse come segue: subClass.prototype = new inheritance(); La prossima cosa è specificare il costruttore per la nostra sottoclassella come segue: subClass.prototype.constructor = subClass; Una volta terminato con la nostra prototipazione di sottoclasse, possiamo specificare le prossime due righe di codice per impostare alcuni puntatori di classe base.
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
Ecco il codice completo per la nostra funzione di estensione:
Inheritance_Manager.extend = function(subClass, baseClass) {
function inheritance() { }
inheritance.prototype = baseClass.prototype;
subClass.prototype = new inheritance();
subClass.prototype.constructor = subClass;
subClass.baseConstructor = baseClass;
subClass.superClass = baseClass.prototype;
}
Ora che abbiamo implementato la nostra eredità, siamo in grado di iniziare ad usarlo per estendere i nostri corsi. In questo caso ci accingiamo a estendere la nostra classe Persona in una classe Manager come segue:
definiamo la classe Manager
Manager = function(id, name, age, salary) {
Person.baseConstructor.call(this, id, name, age);
this.salary = salary;
alert('A manager has been registered.');
}
rendiamo ereditare forma persona
Inheritance_Manager.extend(Manager, Person);
Se notato, abbiamo appena chiamato il metodo di estensione della nostra classe Inheritance_Manager e passato la sottoclass Manager nel nostro caso e poi la persona baseClass. Si noti che l'ordine è molto importante qui. Se li si scambia, l'ereditarietà non funzionerà come previsto. Si noti inoltre che è necessario specificare questa eredità prima di poter effettivamente definire la nostra sottoclasse. Ora definiamo la nostra sottoclasse:
Possiamo aggiungere più metodi come quello qui sotto. La nostra classe Manager avrà sempre i metodi e le proprietà definiti nella classe Person perché eredita da essa.
Manager.prototype.lead = function(){
alert('I am a good leader');
}
Ora per testarlo ci consentono di creare due oggetti, uno dalla persona di classe e uno dalla ereditato classe Manager:
var p = new Person(1, 'Joe Tester', 26);
var pm = new Manager(1, 'Joe Tester', 26, '20.000');
Sentitevi liberi di ottenere la piena codice e altri commenti a: http://www.cyberminds.co.uk/blog/articles/how-to-implement-javascript-inheritance.aspx
Il modo in cui l'hai usato è quasi corretto, ma potresti voler usare Object.create() invece di creare un'istanza della base usando la nuova parola chiave (potrebbe causare problemi se il costruttore base ha bisogno di argomenti). Ho dettagli sul mio blog: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Nota anche che Product() viene effettivamente chiamato due volte. –