Clássica vs protótipo ... como eles são tão diferentes?
-
06-07-2019 - |
Pergunta
Por exemplo, em 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 em 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};
Eu sou novo para javascript, então por favor me esclarecer, não são funcionalmente idênticos, ou estou perdendo algo grande?
Se eles são idênticos, como é diferente clássica de protótipo?
Agradecemos antecipadamente ...
Solução
Em JavaScript você pode alterar a herança como o programa está sendo executado, algo que você não pode fazer na programação clássica. Por exemplo:
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());
Outras dicas
JavaScript (como você observam com razão) usa um tipo específico de OOP que é protótipo baseado . Em JavaScript você não criar classes, você simplesmente clone objetos existentes e aumentando-os por meio de adição de membros para os seus protótipos.
Em PHP você está criando classes que são modelos para novos objetos.
I garantir para Andrew Hare e Marius. É tudo sobre ser capaz de mudar o que uma classe pode fazer por modificá-lo em tempo de execução. OOP clássico não permite que você faça isso, você tem que especificar exatamente o que uma classe / objeto pode fazer e quais propriedades dados que antes de compilar ou antes de ser interpretado (se uma linguagem interpretada).
O código que forneceu é funcionalmente idêntica mas isso é só porque você não tenha aproveitado protótipos em JS.
Class herança com base
- Class e instância são distintos entidades .
- Definir uma classe com uma definição de classe; instanciar uma classe com métodos construtores .
- Criar um único objeto com o novo operador.
- Construir um hierarquia de objetos usando definições de classe para definir subclasses de classes existentes.
- propriedades Inherit seguindo
da cadeia classe . - definição de classe especifica todas as propriedades de todas as instâncias de uma classe. Não é possível adicionar propriedades dinamicamente em tempo de execução .
protótipo baseado herança
- Todos objetos são instâncias .
- Definir e criar um conjunto de objetos com funções de construtor .
- Criar um único objeto com o novo operador.
- Construção uma hierarquia de objetos através da atribuição de um objeto como o protótipo associado com uma função de construtor.
- propriedades Herdar seguindo a cadeia de protótipos .
- função de construtor ou protótipos especifica um conjunto inicial de propriedades. É possível adicionar ou propriedades remove dinamicamente para objetos individuais ou para todo o conjunto de objetos.