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

JsLoveR 01.01.2013 01:11

Наследование на прототипах
 
Привет всем, пытаюсь обуздать прототипное наследование. Возник вопрос, как наследовать свойства родительского класса?:
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)

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

Dim@ 01.01.2013 01:22

JsLoveR,
господь с вами ведь об этом столько написано в интернете и в учебнике на сайте, неужто вы думаете что это новый вопрос и ответа на него нет в литературе?:)

9xakep 01.01.2013 10:44

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,а потом в его прототипе

melky 01.01.2013 13:09

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

будет трудно понять по первому времени, но потом, как придёт озарение, всё станет проще пареной репы.

JsLoveR 01.01.2013 16:00

сделал при помощи метода 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);

Dim@ 01.01.2013 16:19

метод 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 не делает наследования

JsLoveR 01.01.2013 17:20

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

9xakep 01.01.2013 19:05

боюсь спросить зачем? Мой вариант делает то, чтоты хочешь

JsLoveR 01.01.2013 19:36

9xakep, увидел ответ Ильи здесь:
Цитата:

Простое присвоение прототипа - это не наследование. Вместо отдельно методов для родителя (в прототипе родителя) и отдельно - методов для потомка (в его прототипе) - у вас будет один общий прототип. О наследовании тут и речи нет.

Dim@ 01.01.2013 23:45

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


Вот и всё :) :)


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