Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2011, 16:45
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

наследование в javascript
Добрый день!

Подскажите пожалуйста, почему следующий код так работает:

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(); - если создать объект здесь,то все методы работают

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


Точнее интересуют следующие вопросы:
почему объект в первой строке создается без проблем, хотя его "класс" описывается ниже?
почему в созданный объект не попадают методы, которые имеются в прототипе?

Если создать объект в коде ниже строк описывающих наследование, то объект будет содержать все методы.

Возможно, это простые вопросы, но я не могу самостоятельно найти на них ответы, помогите, пожалуйста, разобраться.
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2011, 16:52
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Прототип !== объект. Если вы сделали прототипом объекта массив, сам он от этого массивом не станет. Поэтому метод push и не работает.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #3 (permalink)  
Старый 21.11.2011, 17:23
Новичок на форуме
Отправить личное сообщение для mat5978 Посмотреть профиль Найти все сообщения от mat5978
 
Регистрация: 12.10.2011
Сообщений: 6

Сообщение от trikadin Посмотреть сообщение
Прототип !== объект. Если вы сделали прототипом объекта массив, сам он от этого массивом не станет. Поэтому метод push и не работает.
Из этого следует, что объект всегда нужно создавать после указания прототипа?
Ответить с цитированием
  #4 (permalink)  
Старый 21.11.2011, 17:38
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

А при чем тут наследование?
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2011, 17:56
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от mat5978
Из этого следует, что объект всегда нужно создавать после указания прототипа?
Из этого следует, что не нужно прототип делать массивом. Массивом объект всё равно не станет)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #6 (permalink)  
Старый 21.11.2011, 18:20
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Ну на самом деле во всех современных движках он станет почти массивом, так как особые Сеттеры, про которые говорили в соседней теме - пронаследуются. Правда в v8 например этот объекта не удастся использовать как массив для передачи параметров в метод apply. Это можно посмотреть в исходных кодах, выглядит примерно так:
function apply(object, array){
if(!Array.isArray(array) || !array instanceof Arguments) throw new TypeError('...');
// ...
}

Естественно там внутренние методы используются, хотя isArray тоже вернёт волс на самом деле. В то время как в SpiderMonkey вернёт тру, если не ошибаюсь. Там полностью наследуется поведение массива. То есть такой новый объект и есть массив.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #7 (permalink)  
Старый 21.11.2011, 18:54
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Nekromancer
Ну на самом деле во всех современных движках он станет почти массивом
Сильно сомневаюсь, что это кроссбраузерно.

И делать объект массивом всё же не нужно, на мой взгляд. Зачем?)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #8 (permalink)  
Старый 21.11.2011, 20:00
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Первый раз парсер пробегается по коду, запоминая function, не заглядывая во внутренности. Т.е. пробежавшись, он знает, что timeTable есть. Поэтому ошибки не возникает и присваивание происходит.

Я у себя попроверял.
Если прототип классу присваивается после создания объекта, объект остается без данных прототипа...

Спецификацию не читал, если кто читал - буду рад услышать комментарий по этому поводу.

function Animal(name) {
    this.name = name
    this.canWalk = true
}

function Rabbit(name) {
    this.name = name
}
big = new Rabbit('Chuk')
Rabbit.prototype = new Animal("скотинка");

small = new Rabbit('Gek')

alert(big.canWalk);
alert(small.canWalk);

Последний раз редактировалось Snipe, 21.11.2011 в 20:02.
Ответить с цитированием
  #9 (permalink)  
Старый 21.11.2011, 21:01
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

trikadin,
Ну я и написал, что не кроссбраузерно, даже привёл пример с v8.
А нужно это было мне, для матриц в WebGL, можно выкрутиться там конечно по другому, на так было бы красивее
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #10 (permalink)  
Старый 21.11.2011, 21:12
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Snipe,
Ну видимо, тут дело в том, что для того, что бы расширять уже существующие объекты, нудно расширять прототип, а не заменять его. Заменяя прототип, вы фактически создаёте новый класс. Берём ваш пример и смотрим:
function Animal(name) {
    this.name = name
    this.canWalk = true
}

function Rabbit(name) {
    this.name = name
}
big = new Rabbit('Chuk')
Rabbit.prototype = new Animal("скотинка");

small = new Rabbit('Gek')
alert(big instanceof Rabbit)
alert(small instanceof Rabbit)


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

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, 21.11.2011 в 21:20.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Книга] 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