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 ...

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top