Показать сообщение отдельно
  #1 (permalink)  
Старый 14.06.2016, 15:28
Новичок на форуме
Отправить личное сообщение для AndryG Посмотреть профиль Найти все сообщения от AndryG
 
Регистрация: 14.06.2016
Сообщений: 6

Постижение прототипного наследования. Подтвердите догадку )
Доброго.

Имеем

// общее хранилище данных
function Book{
this.data = {}
}

// странички
function Page(book){
this.book = book;
}

var p1 = new Page(new Book());
var p2 = new Page(p1.book);

Объект book используется для обмена данными между объектами. Так бы я сделал на php.

И тут меня озарило Прототипы!

function Book(){
  this.test = 0;
  this.type = 'BOOK';
}

Book.prototype.createPage = function(PageType){
  PageType.prototype = this; // теперь поле test будет у объектов общее
  return new PageType();
}

Book.prototype.func = function(){
  return 'This is Book.func()';
}

Book.prototype.inc = function(){
  return this.type + ' ' + ++this.test;
}

function PageA(){
  this.type = 'A';
}

function PageB(){
  this.type = 'B';

  this.func = function(){
    return 'This is PageB.func(). Test = ' + this.test;
  }
}

var a = (new Book()).createPage(PageA);
var b = a.createPage(PageB);

alert(a.inc());  // A 1
alert(b.inc());  // B 2
alert(a.func()); // This is Book.func()
alert(b.func()); // This is PageB.func(). Test = 2


Общее хранилище имеем (поле test),
наследование общих методов есть,
переопределить методы/поля можем

Правильно ли я понял и заюзал фишку прототипного наследования ?

Как вызвать родительский метод ? В PageB.func() вызвать родительскую func()
Ответить с цитированием