Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.01.2013, 01:11
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

Наследование на прототипах
Привет всем, пытаюсь обуздать прототипное наследование. Возник вопрос, как наследовать свойства родительского класса?:
function Game() {
		this.canvas = true;
	};
	
	Game.prototype = {
		canvas : null
	};
	//что сделать с классом Player дабы он наследовал свойства и методы класса Game?
	function Player() {
		this.object = this.canvas; //необходимо получить родительский канвас, сделать Player наследником Game  
	};
	
	Player.prototype = {
		object : null
	};
	
	var player = new Player();
	alert(player.object); // хотелось бы true)

До этого с классами не имел дело, туго даётся.

Последний раз редактировалось JsLoveR, 01.01.2013 в 01:20.
Ответить с цитированием
  #2 (permalink)  
Старый 01.01.2013, 01:22
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

JsLoveR,
господь с вами ведь об этом столько написано в интернете и в учебнике на сайте, неужто вы думаете что это новый вопрос и ответа на него нет в литературе?
Ответить с цитированием
  #3 (permalink)  
Старый 01.01.2013, 10:44
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

JsLoveR,
function Game() {
    this.canvas = 10; // У game есть какие-то свойства
}
Game.prototype.canvas2 = 30;

function Player() {
    this.player = 10 // У player тоже
}
Player.prototype = Game.prototype // Наследуем прототип
 
var misha = new Player(); // Создам нового игрока
alert(misha.canvas2) // js в первую очередь ищет canvas2 в Player,а потом в его прототипе
__________________
оляля, ололо

Последний раз редактировалось 9xakep, 01.01.2013 в 10:47.
Ответить с цитированием
  #4 (permalink)  
Старый 01.01.2013, 13:09
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

JsLoveR, http://learn.javascript.ru/prototype

будет трудно понять по первому времени, но потом, как придёт озарение, всё станет проще пареной репы.
Ответить с цитированием
  #5 (permalink)  
Старый 01.01.2013, 16:00
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

сделал при помощи метода call:
function Game() {
		this.canvas = true;
	};
	
	Game.prototype = {
		canvas : null,
	};
	
	function Player() {
		Game.call(this); 
		this.object = this.canvas;
	};
	
	Player.prototype = {
		object : null,
	};

	var player = new Player();
	alert(player.object);
Ответить с цитированием
  #6 (permalink)  
Старый 01.01.2013, 16:19
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

метод call не делает наследования, он всего лишь добавляет те свойства которые были указаны в первой функции, но прототип не трогается, а при наследовании прототип должен быть тронут
function Game() {
		this.canvas = true;
	};
	
	Game.prototype = {
		canvas : null,
		play : function () {
			alert("play");
		}
	};
	
	function Player() {
		Game.call(this); 
		this.object = this.canvas;
	};
	
	Player.prototype = {
		object : null,
	};

	var player = new Player();
	alert(player.object);
	player.play();//метода нет, а при наследовании он должен быть => call не делает наследования
Ответить с цитированием
  #7 (permalink)  
Старый 01.01.2013, 17:20
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

Dim@, ага, понял и сам потестив немного). Решил, в общем, использовать фун-ю 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 Game() {
		this.canvas = true;
	};
	
	Game.prototype = {
		canvas : null,
		play : function () {
            alert("play");
        }
	};
	
	function Player() {
		this.object = this.canvas;
	};
	
	Player.prototype = {
		object : null,
	};
	
	extend(Player, Game);
	
	var player = new Player();
	
	alert(player.object); // null
	player.play(); // play

Последний раз редактировалось JsLoveR, 01.01.2013 в 17:39.
Ответить с цитированием
  #8 (permalink)  
Старый 01.01.2013, 19:05
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

боюсь спросить зачем? Мой вариант делает то, чтоты хочешь
__________________
оляля, ололо
Ответить с цитированием
  #9 (permalink)  
Старый 01.01.2013, 19:36
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

9xakep, увидел ответ Ильи здесь:
Цитата:
Простое присвоение прототипа - это не наследование. Вместо отдельно методов для родителя (в прототипе родителя) и отдельно - методов для потомка (в его прототипе) - у вас будет один общий прототип. О наследовании тут и речи нет.
Ответить с цитированием
  #10 (permalink)  
Старый 01.01.2013, 23:45
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

JsLoveR,
тебе не понятно почему player.object == null? если да то вот почему (построчно):
1) (F.prototype = Parent.prototype) прототип ф-и F это прототип ф-и Game, то есть
{
        canvas : null,
        play : function () {
            alert("play");
        }
}

2)(Child.prototype = new F()) прототип Child теперь тоже
{
        canvas : null,
        play : function () {
            alert("play");
        }
}

3) строка поправление конструктора
4) эта строка позволяет обращатся к родителю

Итог:
Player.prototype == {
        canvas : null,
        play : function () {
            alert("play");
        }
}

теперь строка
this.object = this.canvas;
устанавливает this.object значение null, ибо в прототипе
canvas : null


Вот и всё
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прототипное наследование не распространяется на вложенные свойства? novikov Общие вопросы Javascript 4 19.11.2012 14:31
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13
Наследование от встроенного Error khusamov Общие вопросы Javascript 8 01.02.2012 13:32
Наследование в CSS SunnyDay (X)HTML/CSS 14 06.10.2008 20:06
наследование установок динамически создаваемыми элементами majestic jQuery 1 15.09.2008 13:21