Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Постижение прототипного наследования. Подтвердите догадку ) (https://javascript.ru/forum/misc/63549-postizhenie-prototipnogo-nasledovaniya-podtverdite-dogadku.html)

AndryG 14.06.2016 14:28

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

Имеем

// общее хранилище данных
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()

aklis 14.06.2016 14:54

Гдето есть курсы "как вынести мозг с двух строк" ?:blink:

pureJS 14.06.2016 15:09

AndryG, очень подробно всё расписано тут:
ООП в javascript: наследование

AndryG 14.06.2016 15:39

Цитата:

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

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

Хочу услышать от знатоков, верно ли я исползьую этот механизм.

AndryG 14.06.2016 16:24

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

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

Я не просил пустословить и забивать тему мусором. Если не заешь что сказать, то просто промолчи.

AndryG 14.06.2016 18:26

Rise, повторюсь: "Если не понимаешь - не пиши чепухи" :) Неадекватушка.

ruslan_mart 14.06.2016 19:34

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

AndryG 15.06.2016 00:03

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

Будем нарабатывать на прозрение...

pureJS 15.06.2016 19:31

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

ruslan_mart 15.06.2016 20:53

pureJS, плохой подход.


Часовой пояс GMT +3, время: 23:25.