Наследование на прототипах
Привет всем, пытаюсь обуздать прототипное наследование. Возник вопрос, как наследовать свойства родительского класса?:
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,
господь с вами ведь об этом столько написано в интернете и в учебнике на сайте, неужто вы думаете что это новый вопрос и ответа на него нет в литературе?:) |
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,а потом в его прототипе |
JsLoveR, http://learn.javascript.ru/prototype
будет трудно понять по первому времени, но потом, как придёт озарение, всё станет проще пареной репы. |
сделал при помощи метода 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); |
метод 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 не делает наследования |
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, увидел ответ Ильи здесь:
Цитата:
|
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. |