Classica vs Prototipica ... come sono così diverse?
-
06-07-2019 - |
Domanda
ad esempio in PHP
class foo{
function foo($name){ //constructor
$this->name=$name;
}
function sayMyName(){
return $this->name;
}
}
class bar extends foo{
function sayMyName(){
return "subclassed ".$this->name;
}
}
E in JS
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function bar(){}
bar.prototype=new foo();
bar.prototype.sayMyName=function(){return "subclassed "+this.name};
Sono nuovo di JavaScript, quindi per favore illuminami, non sono funzionalmente identici o mi sto perdendo qualcosa di enorme?
Se sono identici, in cosa differisce la classica dal prototipo?
grazie in anticipo ...
Soluzione
In JavaScript puoi modificare l'eredità mentre il programma è in esecuzione, cosa che non puoi fare nella programmazione classica. Ad esempio:
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function foo2(name){
this.name = name;
}
foo2.prototype.sayMyName = function(){return "My name is "+this.name;};
function bar(){}
bar.prototype = new foo();
var myBar = new bar();
myBar.name = "Marius";
alert(myBar.sayMyName());
bar.prototype = new foo2();
var myBar2 = new bar();
myBar2.name = "Marius";
alert(myBar2.sayMyName());
Altri suggerimenti
JavaScript (come giustamente fai notare) utilizza un tipo specifico di OOP che è basato su prototipo . In JavaScript non crei classi, devi semplicemente clonare oggetti esistenti e aumentarli aggiungendo membri ai loro prototipi.
In PHP stai creando classi che sono progetti per nuovi oggetti.
Garantisco Andrew Hare e Marius. Si tratta solo di riuscire a cambiare ciò che una classe può fare modificandola in fase di esecuzione. L'OOP classica non ti consente di farlo, devi specificare esattamente cosa può fare una classe / oggetto e quali proprietà dei dati ha prima di compilare o prima che venga interpretato (se un linguaggio interpretato).
Il codice che hai fornito è funzionalmente identico, ma è solo perché non hai sfruttato i prototipi in JS.
Eredità basata sulla classe
- Classe e istanza sono distinte entità .
- Definisce una classe con una definizione di classe; creare un'istanza di una classe con metodi di costruzione .
- Crea un singolo oggetto con il nuovo operatore.
- Costruisci una gerarchia di oggetti usando le definizioni di classe per definire sottoclassi di classi esistenti.
- Eredita le proprietà seguendo la catena di classi .
- La definizione della classe specifica tutte le proprietà di tutte le istanze di una classe. Impossibile aggiungere proprietà in modo dinamico in fase di esecuzione .
Eredità basata sul prototipo
- Tutti gli oggetti sono istanze .
- Definisci e crea un insieme di oggetti con funzioni di costruzione .
- Crea un singolo oggetto con il nuovo operatore.
- Costruisci una gerarchia di oggetti assegnando un oggetto come prototipo associato a una funzione di costruzione.
- Eredita le proprietà seguendo la catena di prototipi .
- La funzione o il prototipo del costruttore specifica un insieme iniziale di proprietà. Può aggiungere o rimuovere proprietà dinamicamente ai singoli oggetti o all'intero insieme di oggetti.