Классический против прототипного… чем они так отличаются?

StackOverflow https://stackoverflow.com/questions/1811422

Вопрос

например, в 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, поэтому, пожалуйста, просветите меня, разве они функционально не идентичны, или я упускаю что-то важное?
Если они идентичны, то чем классический отличается от прототипного?

заранее благодарю...

Это было полезно?

Решение

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

Другие советы

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

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

Наследование на основе классов

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

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

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