Классика против Прототипа ... чем они такие разные? - PullRequest
1 голос
/ 28 ноября 2009

например в 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;
  }
}

А в 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};

Я новичок в javascript, поэтому, пожалуйста, просветите меня. Разве они функционально не идентичны или я что-то упустил? Если они идентичны, чем классика отличается от прототипа?

спасибо заранее ...

Ответы [ 4 ]

6 голосов
/ 28 ноября 2009

В JavaScript вы можете изменить наследование во время работы программы, чего вы не можете сделать в классическом программировании. Например:

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());
2 голосов
/ 28 ноября 2009

Я ручаюсь за Эндрю Хара и Мариуса. Это все о возможности изменить то, что может делать класс, изменяя его во время выполнения. Классическая ООП не позволяет вам этого делать, вы должны точно указать, что может делать класс / объект и какие свойства данных он имеет перед компиляцией или перед интерпретацией (если интерпретируемый язык).

Код, который вы предоставили, функционально идентичен, но это только потому, что вы не воспользовались прототипами в JS.

2 голосов
/ 28 ноября 2009

JavaScript (как вы правильно заметили) использует особый тип ООП, который основан на прототипе . В JavaScript вы не создаете классы, вы просто клонируете существующие объекты и расширяете их путем добавления членов к их прототипам.

В PHP вы создаете классы, которые являются чертежами для новых объектов.

0 голосов
/ 02 февраля 2010

Классовое наследование

  • Класс и экземпляр различны лица .
  • Определить класс с определением класса; создать экземпляр класса с помощью методов конструктора .
  • Создать отдельный объект с новым оператором.
  • Построить иерархию объектов , используя определения классов для определения подклассов существующих классов.
  • Наследуйте свойства, следуя цепочке классов .
  • Определение класса определяет все свойства всех экземпляров класса. Невозможно динамически добавлять свойства во время выполнения .

Наследование на основе прототипа

  • Все объекты являются экземплярами .
  • Определение и создание набора объектов с помощью функций конструктора .
  • Создайте отдельный объект с новым оператором.
  • Создание иерархии объектов путем назначения объекта в качестве прототипа , связанного с функцией конструктора.
  • Унаследуйте свойства, следуя цепочке прототипов .
  • Функция-конструктор или прототип задает начальный набор свойств. Может динамически добавлять или удалять свойства для отдельных объектов или для всего набора объектов.
...