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