Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.11.2011, 21:37
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Ну тогда у автора топика все то же самое
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)
Ответить с цитированием
  #12 (permalink)  
Старый 21.11.2011, 21:45
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Ну да, всё правильно. Наследование в JS определяется же не по функции которая создала объект, а по прототипу принадлежащему этой функции.
У меня алерт выдаёт - фолс, и правильно делает) ведь теперь его inctance другой.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #13 (permalink)  
Старый 22.11.2011, 14:58
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

Сообщение от Nekromancer Посмотреть сообщение

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

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);
В данном случае у объектов есть только свойства. А если у них будут еще и методы, как будет выглядеть наследование?
Ответить с цитированием
  #14 (permalink)  
Старый 22.11.2011, 16:01
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Методы это те же свойства, всё точно так же.
Или вы хотите сделать что бы когда, вы вызываете someMethod у объекта, этот метод вызывался у всех прототипов?
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #15 (permalink)  
Старый 22.11.2011, 16:25
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

Сообщение от Nekromancer Посмотреть сообщение
Методы это те же свойства, всё точно так же.
Или вы хотите сделать что бы когда, вы вызываете someMethod у объекта, этот метод вызывался у всех прототипов?
да. Могу я, например, сделать вот так:
B = inherit(function(){
	 this.bar = 2;
         this.showBar = function(){
            document.write(this.bar);
         }
}, A)


Этот showBar будет только у B, у A его не будет? А можно чтобы он и у A был?
Ответить с цитированием
  #16 (permalink)  
Старый 22.11.2011, 16:53
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

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

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

Ну или если вы так желаете, можно в теле конструктора -
var A = function(){
this.showBar = function(){
//...
}
}
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #17 (permalink)  
Старый 23.11.2011, 11:40
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

Сообщение от Nekromancer Посмотреть сообщение
Первым параметром вставляется обработчик нового класса, он будет вызываться только когда создаётся 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


Из-за того что "лишний" объект создается?
Ответить с цитированием
  #18 (permalink)  
Старый 23.11.2011, 12:01
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

Сообщение от trikadin Посмотреть сообщение
Из этого следует, что не нужно прототип делать массивом. Массивом объект всё равно не станет)
Скажите, пожалуйста, в случае с моим скриптом, могу ли я расширить 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(); // Информатика
Ответить с цитированием
  #19 (permalink)  
Старый 23.11.2011, 16:17
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Книга] Stoyan Stefanov, Javascript Patterns Dmitry A. Soshnikov Учебные материалы 20 13.08.2013 11:37
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
javascript вставки в vrml сцены. Передать событие из броузера Proletariy Javascript под браузер 0 10.05.2011 12:26
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34