Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.06.2016, 14: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()
Ответить с цитированием
  #2 (permalink)  
Старый 14.06.2016, 14:54
Кандидат Javascript-наук
Отправить личное сообщение для aklis Посмотреть профиль Найти все сообщения от aklis
 
Регистрация: 27.04.2015
Сообщений: 99

Гдето есть курсы "как вынести мозг с двух строк" ?
Ответить с цитированием
  #3 (permalink)  
Старый 14.06.2016, 15:09
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

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

Цитата:
А что василий в php наследования нет?
Вопрос не в наследовании, а в классе для общих данных.

Страницу про наследование изучил раньше ещё вдоль и поперек.
Именно после её прочтения и решил использовать "прототипные" фишки.

Хочу услышать от знатоков, верно ли я исползьую этот механизм.
Ответить с цитированием
  #5 (permalink)  
Старый 14.06.2016, 16:24
Новичок на форуме
Отправить личное сообщение для AndryG Посмотреть профиль Найти все сообщения от AndryG
 
Регистрация: 14.06.2016
Сообщений: 6

Rise, вам если влом начальный топик полностью прочесть, то не надо ёрничать в теме.

Я показал одну архитектуру, затем переложил её на вариант с прототипами и попросил оценить, так ли это делается.

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

Rise, повторюсь: "Если не понимаешь - не пиши чепухи" Неадекватушка.
Ответить с цитированием
  #7 (permalink)  
Старый 14.06.2016, 19:34
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

AndryG, не логично и не правильно Вы сделали, пару примеров наследования:


var ParentClass = function() {

};

ParentClass.prototype.bar = function() {
    alert('foo bar');
};


var MyClass = function() {
 
};

MyClass.prototype = Object.create(ParentClass.prototype);

MyClass.prototype.foo = function() {
     this.bar();
};


var a = new MyClass();
a.foo();



var ParentClass = function() {

};

ParentClass.prototype.bar = function() {
    alert('foo bar');
};



var MyClass = function() {
 
};

MyClass.prototype = {
    foo: function() {
        this.bar();
    },

    __proto__: Object.create(ParentClass.prototype)
};


var a = new MyClass();
a.foo();

Последний раз редактировалось ruslan_mart, 14.06.2016 в 19:39.
Ответить с цитированием
  #8 (permalink)  
Старый 15.06.2016, 00:03
Новичок на форуме
Отправить личное сообщение для AndryG Посмотреть профиль Найти все сообщения от AndryG
 
Регистрация: 14.06.2016
Сообщений: 6

Фальстарт. Ваши примеры вообще непостижимая грамота.

Будем нарабатывать на прозрение...
Ответить с цитированием
  #9 (permalink)  
Старый 15.06.2016, 19:31
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

AndryG, может быть вот так будет проще понять:
var Родитель = function(фамилия)
{
    this.фамилия = фамилия || 'безымянный';
    this.public_method = function()
    {
        alert('Public method')
    }
};

var Ребёнок = function()
{
    this.public_method = function()
    {
        alert('Переопределённый public method')
    };

    this.скажи_чей_ты = function()
    {
        alert('Моя фамилия: ' + this.фамилия)
    }
};

//Класс "Родитель" является предком для класса "Ребёнок",
//у которого переопределён метод public_method. 
Ребёнок.prototype = new Родитель('Батькович');

var test = new Ребёнок();
test.скажи_чей_ты(); // => "Моя фамилия: Батькович"
test.public_method(); // => "Переопределённый public method"
alert(test.фамилия); // => "Батькович"

Что ещё можно почитать про ООП в JS:
ООП в JavaScript
Основы и заблуждения насчёт JavaScript
Ответить с цитированием
  #10 (permalink)  
Старый 15.06.2016, 20:53
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

pureJS, плохой подход.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск