Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Унаследовать без привязки к объектам (https://javascript.ru/forum/misc/18419-unasledovat-bez-privyazki-k-obektam.html)

TicTac 30.06.2011 01:17

Унаследовать без привязки к объектам
 
/*Базовый*/
        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);

TicTac 30.06.2011 01:26

Еще так работает
/*Базовый*/
        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);

не нужно создавать объектов

Riim 30.06.2011 01:35

Цитата:

Сообщение от TicTac
не нужно создавать объектов

про наследование без создания экземпляров здесь: http://javascript.ru/tutorial/object/inheritance

TicTac 03.07.2011 16:49

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

Можете подсказать такой вопрос. Почему вызов функции 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);

Riim 03.07.2011 17:02

Цитата:

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

такая же ситуация

TicTac 08.07.2011 15:48

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

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

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

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

TicTac 08.07.2011 16:05

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

Цитата:

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


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