Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   наследование в javascript (https://javascript.ru/forum/misc/23367-nasledovanie-v-javascript.html)

Snipe 21.11.2011 21:37

Ну тогда у автора топика все то же самое
var todayTimeTable = new timeTable();
    function timeTable(){
        this.showHeader = function(){
            document.write("Расписание на сегодня<br />");
        }
    }
     
    timeTable.prototype = new Array;
    timeTable.prototype.showFirst = function(){
        document.write(this[0]);
    }
     
    // var todayTimeTable = new timeTable(); - если создать объект здесь,то все методы работают
 
    alert(todayTimeTable instanceof timeTable)

Nekromancer 21.11.2011 21:45

Ну да, всё правильно. Наследование в JS определяется же не по функции которая создала объект, а по прототипу принадлежащему этой функции.
У меня алерт выдаёт - фолс, и правильно делает) ведь теперь его inctance другой.

mat5978 22.11.2011 14:58

Цитата:

Сообщение от Nekromancer (Сообщение 138218)

По хорошему конечно, наследование нужно организовывать приблезительно так:

var create = Object.create || (Object.create = function(proto){
	var constructor = function(){};
	constructor.prototype = proto;
	return new constructor;
}), inherit = function(childHandler, parent){
	var child = function(){
		parent.apply(this, arguments);
		childHandler.apply(this, arguments);
	};
	child.prototype = create(parent.prototype);
	child.prototype.__parent__ = parent;
	return child;
}
var A = function(){
	this.foo = 1;
},
B = inherit(function(){
	this.bar = 2;
}, A),
c = new B();
alert(c instanceof B);
alert(c instanceof A);

В данном случае у объектов есть только свойства. А если у них будут еще и методы, как будет выглядеть наследование?

Nekromancer 22.11.2011 16:01

Методы это те же свойства, всё точно так же.
Или вы хотите сделать что бы когда, вы вызываете someMethod у объекта, этот метод вызывался у всех прототипов?

mat5978 22.11.2011 16:25

Цитата:

Сообщение от Nekromancer (Сообщение 138345)
Методы это те же свойства, всё точно так же.
Или вы хотите сделать что бы когда, вы вызываете someMethod у объекта, этот метод вызывался у всех прототипов?

да. Могу я, например, сделать вот так:
B = inherit(function(){
	 this.bar = 2;
         this.showBar = function(){
            document.write(this.bar);
         }
}, A)


Этот showBar будет только у B, у A его не будет? А можно чтобы он и у A был?

Nekromancer 22.11.2011 16:53

Первым параметром вставляется обработчик нового класса, он будет вызываться только когда создаётся B. Что бы метод был в обоих классах, его нужно задавать у родителя.

A.prototype.showBar = function(){
// ...
}

Ну или если вы так желаете, можно в теле конструктора -
var A = function(){
this.showBar = function(){
//...
}
}

mat5978 23.11.2011 11:40

Цитата:

Сообщение от Nekromancer (Сообщение 138356)
Первым параметром вставляется обработчик нового класса, он будет вызываться только когда создаётся B. Что бы метод был в обоих классах, его нужно задавать у родителя.

A.prototype.showBar = function(){
// ...
}

Ну или если вы так желаете, можно в теле конструктора -
var A = function(){
this.showBar = function(){
//...
}
}

Следующий подход наверное неверен?
var A = function(){
	    this.foo = 1;
	},
	
	 B = function(){
	    this.bar = 2;
	};
 
 var objA = new A();
 
 B.prototype = objA;
 
 var c = new B();
 
 alert(c instanceof A); //true
 alert(c instanceof B);	//true


Из-за того что "лишний" объект создается?

mat5978 23.11.2011 12:01

Цитата:

Сообщение от trikadin (Сообщение 138157)
Из этого следует, что не нужно прототип делать массивом. Массивом объект всё равно не станет)

Скажите, пожалуйста, в случае с моим скриптом, могу ли я расширить Array дополнительными методами showHeader и showFirst?

Или этот подход неверен?

Вот так скрипт работает:

var todayTimeTable = new Array();
	Array.prototype.showHeader = function(){
		document.write("Расписание на сегодня<br />");
	}    
	Array.prototype.showFirst = function(){
	        document.write(this[0]);
    }	

 todayTimeTable.showHeader(); //Расписание на сегодня
 todayTimeTable.push("Информатика"); 
 todayTimeTable.showFirst(); // Информатика

Nekromancer 23.11.2011 16:17

mat5978,
неверно потому, что конструктор родителя вызывается когда вы создаёте новый конструктор, а это не совсем удобно/правильно.


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