Pregunta

por ejemplo en 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;
  }
}

Y en 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};

Soy nuevo en javascript, así que, por favor, ilumíneme, ¿no son funcionalmente idénticos o me falta algo enorme?
Si son idénticos, ¿en qué se diferencia el clásico del prototípico?

gracias de antemano ...

¿Fue útil?

Solución

En JavaScript puede cambiar la herencia mientras se ejecuta el programa, algo que no puede hacer en la programación clásica. Por ejemplo:

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

Otros consejos

JavaScript (como lo señala correctamente) utiliza un tipo específico de POO que es prototipo basado . En JavaScript no creas clases, simplemente clonas objetos existentes y los aumentas agregando miembros a sus prototipos.

En PHP está creando clases que son planos para nuevos objetos.

Yo respondo por Andrew Hare y Marius. Se trata de poder cambiar lo que puede hacer una clase modificándola en tiempo de ejecución. La OOP clásica no le permite hacer eso, debe especificar exactamente qué puede hacer una clase / objeto y qué propiedades de datos tiene antes de compilar o antes de que se interprete (si es un lenguaje interpretado).

El código que proporcionó es funcionalmente idéntico, pero eso es solo porque no se ha aprovechado de los prototipos en JS.

Herencia basada en la clase

  • La clase y la instancia son distintas entidades .
  • Defina una clase con una definición de clase; crear una instancia de una clase con métodos de construcción .
  • Cree un solo objeto con el nuevo operador.
  • Construya una jerarquía de objetos utilizando definiciones de clase para definir subclases de clases existentes.
  • Herede las propiedades siguiendo la cadena de clase .
  • La definición de clase especifica todas las propiedades de todas las instancias de una clase. No se pueden agregar propiedades dinámicamente en tiempo de ejecución .

Herencia basada en prototipo

  • Todos los objetos son instancias .
  • Defina y cree un conjunto de objetos con funciones de constructor .
  • Cree un solo objeto con el nuevo operador.
  • Construya una jerarquía de objetos asignando un objeto como prototipo asociado con una función constructora.
  • Herede las propiedades siguiendo la cadena de prototipos .
  • La función de constructor o prototipo especifica un conjunto inicial de propiedades. Puede agregar o eliminar propiedades dinámicamente a objetos individuales o al conjunto completo de objetos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top