Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.06.2011, 01:17
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Унаследовать без привязки к объектам
/*Базовый*/
        function X(x) {
			this.x = x;
		}
        X.prototype.getX = function(){return this.x;}
        var x = new X(5);

        /*Y*/
        function Y(y) {
            this.y = y;
        }
        Y.prototype = x; /*Наследем свойства/методы объекта x*/
        Y.prototype.getY = function(){return this.y;}
        var y = new Y(7);

        /*Add*/
        function Add() {
			this.add = this.getX() + this.getY();
		}
        Add.prototype = y; /*Наследем y, + свойства/методы объекта x*/
        Add.prototype.getAdd = function(){return this.add;}


        var addTwoNum = new Add();
        console.log(addTwoNum.add);


Немножко туповато вышло, но я получил унаследованные свойства/методы из выше по иерархии "классов".

Можно как то переделать код чтобы не так наследовать Y.prototype = x; и Add.prototype = y;, то есть по сути мне нужно сначала создать объекты x,y их инициализировать и наследовать.

А как то так
Y.prototype = X.prototype;
Add.prototype = Y.prototype;

И потом когда все будет в объекте типа Add(), туда передавать два значения x и y (new Add(5,7)), а там уже должны быть свойства
this.x = x;
this.y = y;
X.prototype.getX = function(){return this.x;}
Y.prototype.getY = function(){return this.y;}

Выходит все тоже самое просто убить создание промежуточных объектов
var x = new X(5);
var y = new Y(7);
Ответить с цитированием
  #2 (permalink)  
Старый 30.06.2011, 01:26
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Еще так работает
/*Базовый*/
        function X(x) {
			this.x = x;
		}
        X.prototype.getX = function(){return this.x;}

        /*Y*/
        function Y(y) {
            this.y = y;
        }
        Y.prototype = new X(); /*Наследем свойства/методы объекта x*/
        Y.prototype.getY = function(){return this.y;}
        var y = new X();

        /*Add*/
        function Add(x,y) {
            this.x = x;
            this.y = y;
			this.add = this.getX() + this.getY();
		}
        Add.prototype = new Y(); /*Наследем y, + свойства/методы объекта x*/
        Add.prototype.getAdd = function(){return this.add;}


        var addTwoNum = new Add(5,7);
        console.log(addTwoNum.add);

не нужно создавать объектов
Ответить с цитированием
  #3 (permalink)  
Старый 30.06.2011, 01:35
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от TicTac
не нужно создавать объектов
про наследование без создания экземпляров здесь: http://javascript.ru/tutorial/object/inheritance
Ответить с цитированием
  #4 (permalink)  
Старый 03.07.2011, 16:49
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Спасибо, очень познавательно

Можете подсказать такой вопрос. Почему вызов функции extend после добавления методов/свойств, полного описания класса вызывает ошибку

Например(рабочий пример)
function extend(Child, Parent) {
     var F = function() { }
     F.prototype = Parent.prototype
     Child.prototype = new F()
     Child.prototype.constructor = Child
     Child.superclass = Parent.prototype
 }

/*Базовый*/
function X(x) {this.x = x;}
X.prototype.getX = function(){return this.x;}

/*Y*/
function Y(y) {this.y = y;}
extend(Y, X);
Y.prototype.getY = function(){return this.y;}

/*Add*/
function Add(x,y) {
    this.x = x ;
    this.y = y;
    this.add = this.getX() + this.getY();
}
extend(Add, Y);
Add.prototype.getAdd = function(){return this.add;}

var addTwoNum = new Add(5,7);
console.log(addTwoNum.add);


все хорошо, наследуется, ошибок нет

А вот так вызовет уже ошибку
Цитата:
Uncaught TypeError: Object #<Add> has no method 'getY'
function extend(Child, Parent) {
     var F = function() { }
     F.prototype = Parent.prototype
     Child.prototype = new F()
     Child.prototype.constructor = Child
     Child.superclass = Parent.prototype
 }

/*Базовый*/
function X(x) {this.x = x;}
X.prototype.getX = function(){return this.x;}

/*Y*/
function Y(y) {this.y = y;}
Y.prototype.getY = function(){return this.y;}

/*Add*/
function Add(x,y) {
    this.x = x ;
    this.y = y;
    this.add = this.getX() + this.getY();
}
Add.prototype.getAdd = function(){return this.add;}

extend(Y, X);
extend(Add, Y);

var addTwoNum = new Add(5,7);
console.log(addTwoNum.add);

Последний раз редактировалось TicTac, 03.07.2011 в 16:55.
Ответить с цитированием
  #5 (permalink)  
Старый 03.07.2011, 17:02
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от TicTac
Почему вызов функции extend после добавления методов/свойств, полного описания класса вызывает ошибку
такая же ситуация

Последний раз редактировалось Riim, 03.07.2011 в 17:05.
Ответить с цитированием
  #6 (permalink)  
Старый 08.07.2011, 15:48
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Подскажите я правильно понял.

Выходит я сначала добавил метод
Y.prototype.getY = function(){return this.y;}

через prototype, а потом
extend(Y, X);

и extend перезаписал его, а точнее весь prototype родительским свойствами/методами?

Последний раз редактировалось TicTac, 08.07.2011 в 21:45.
Ответить с цитированием
  #7 (permalink)  
Старый 08.07.2011, 16:05
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Вот тут еще вычитал
http://javascript.ru/tutorial/object...-nasledovaniya

Цитата:
Конечно же, вызовы extend и mixin можно объединить в одну функцию. В примере это не сделано для наглядности происходящего.
можете подсказать зачем это нужно делать? почему нельзя просто воспользоватся extend или mixin
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно сделать подгрузку и смену изображения без перезагрузки страницы с другого Евгений Болгов jQuery 11 21.10.2010 18:18
Подскажите как в VLC плеере переключать канал без перезагрузки страницы? mff Events/DOM/Window 0 10.05.2010 17:28
Открытие нового окна без скролбаров без верхнего бара "файл правка вид и тп" Mara Общие вопросы Javascript 2 18.02.2010 15:11
реализация добавления поля формы без перезагрузки sc2r2bey Элементы интерфейса 1 31.07.2009 16:51
как сделать аналог jquery.load без jquery? vvsh AJAX и COMET 5 05.06.2009 22:40