Правила раздела:
1 Задавайте конкретные вопросы. Для болтовни есть свободный раздел.
2 По возможности давайте конкретные ответы.
3 Один вопрос=одна тема. Если хотите задать ещё вопрос, то начинайте новую тему.
4 Название темы должно составлять сам вопрос, и быть максимально конкретным. Рекомендуется начинать тему словами "Как", "Что", "Почему". А первый пост повторяет вопрос и даёт расширенные сведения.
5 Рекомендуется указывать версию мейкера (2000, 2003, RMXP, RMVX, ACE, IGM, и.т.д.. Это важно, и всё равно ведь спросят.
6 Темы "Пара вопросов", "Помогите", и подобные им - самый лёгкий путь к бану.
7 Поиск находится вверху справа.
А. Названия подразделов этого раздела уточняются. Советы принимаются.
1 Задавайте конкретные вопросы. Для болтовни есть свободный раздел.
2 По возможности давайте конкретные ответы.
3 Один вопрос=одна тема. Если хотите задать ещё вопрос, то начинайте новую тему.
4 Название темы должно составлять сам вопрос, и быть максимально конкретным. Рекомендуется начинать тему словами "Как", "Что", "Почему". А первый пост повторяет вопрос и даёт расширенные сведения.
5 Рекомендуется указывать версию мейкера (2000, 2003, RMXP, RMVX, ACE, IGM, и.т.д.. Это важно, и всё равно ведь спросят.
6 Темы "Пара вопросов", "Помогите", и подобные им - самый лёгкий путь к бану.
7 Поиск находится вверху справа.
А. Названия подразделов этого раздела уточняются. Советы принимаются.
MV 1.6: Что нового?
8 года 2 мес. назад - 8 года 2 мес. назад #102735
от Mur
Да по сути ничего в нём и нет:
И всё! Я уже могу обращаться к MUR.NPC.block_handler() и всё работает. Собственно вопрос-то и был, в том, что достаточно создать объект {} и можно «пихать» в него что угодно? o_O в том числе и функции?
И сразу второй вопрос, а что будет если я потом захочу переопределить эту фукнцию, как раньше мы делали с базовыми классами?
И у меня есть подозрения, что у меня это не получится сделать ~_~'
Ох! А можно просто примерчик, как всё-таки ПРАВИЛЬНО оформить свой плагин в виде класса, что бы в последствии можно было наследовать и менять методы?
Я просто помню, что вот была такая конструкция, делаем свою новую сцену(Scene_Achievements) наследуя её от Scene_ItemBase:
Но это если мы наследуем. А если я просто делаю свой базовый класс? Что тогда указывать в качестве родителя? Ничего? Будет так работать?
Mur ответил в теме MV 1.6: Что нового?
EvilCat пишет: Мне не хватает знания об устройстве плагина, чтобы ответить точно...
Да по сути ничего в нём и нет:
Code:
var MUR = MUR || {}; // MUR's main object
MUR.NPC = MUR.NPC || {}; // Plugins's stuff
MUR.NPC.block_handler = function (data, step, force) {
bla bla bla…
}
И всё! Я уже могу обращаться к MUR.NPC.block_handler() и всё работает. Собственно вопрос-то и был, в том, что достаточно создать объект {} и можно «пихать» в него что угодно? o_O в том числе и функции?
И сразу второй вопрос, а что будет если я потом захочу переопределить эту фукнцию, как раньше мы делали с базовыми классами?
Code:
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
bla bla bla
};
И у меня есть подозрения, что у меня это не получится сделать ~_~'
EvilCat пишет: Просто перескажу, как работают прототипы.
Ох! А можно просто примерчик, как всё-таки ПРАВИЛЬНО оформить свой плагин в виде класса, что бы в последствии можно было наследовать и менять методы?
Я просто помню, что вот была такая конструкция, делаем свою новую сцену(Scene_Achievements) наследуя её от Scene_ItemBase:
Code:
function Scene_Achievements() {
this.initialize.apply(this, arguments);
}
Scene_Achievements.prototype = Object.create(Scene_ItemBase.prototype);
Scene_Achievements.prototype.constructor = Scene_Achievements;
Scene_Achievements.prototype.initialize = function() {
Scene_ItemBase.prototype.initialize.call(this);
};
Scene_Achievements.prototype.create = function() {
Scene_ItemBase.prototype.create.call(this);
this.achievementsInit();
};
Scene_Achievements.prototype.achievementsInit = function() {
....
};
Но это если мы наследуем. А если я просто делаю свой базовый класс? Что тогда указывать в качестве родителя? Ничего? Будет так работать?
Code:
Scene_Achievements.prototype = Object.create();
Последнее редактирование: 8 года 2 мес. назад пользователем Mur.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
8 года 2 мес. назад #102736
от EvilCat
EvilCat ответил в теме MV 1.6: Что нового?
Прототипы в Яваскрипте вообще были не с самого начала, а были придуманы в одной сторонней библиотеке, а уже потом, как очень полезная и повсеместно используемая инновация, были приняты в стандартный синтаксис.
То есть, если нам нужен совершенно уникальный объект, который будет всегда в одном экземпляре, никогда не будет создан новый и никогда ничего от него не унаследовано, то всегда можно было написать:
...а потом вызывать God.doSomething(). Никакого класса, никаких прототипов.
Но если необходимо наследование (или если воображаешь, что кому-то из игроделов-пользователей плагина захочется унаследовать от него свой), то да, наследование в Яваскрипте делается с помощью прототипов. А именно - если взять нашего Кота и его СемействоКошачьих, то у прототипа СемействаКошачьих тоже может быть свой конструктор ОтрядХищных, а у него прототип, и так далее по цепочке... Поиск полей объекта идёт по цепочке прототипов, пока та не закончится. Это и есть наследование.
Эти строчки как раз делают следующее:
То есть, если нам нужен совершенно уникальный объект, который будет всегда в одном экземпляре, никогда не будет создан новый и никогда ничего от него не унаследовано, то всегда можно было написать:
Code:
var God = {}
God.doSomething = function () { ... }
...а потом вызывать God.doSomething(). Никакого класса, никаких прототипов.
Но если необходимо наследование (или если воображаешь, что кому-то из игроделов-пользователей плагина захочется унаследовать от него свой), то да, наследование в Яваскрипте делается с помощью прототипов. А именно - если взять нашего Кота и его СемействоКошачьих, то у прототипа СемействаКошачьих тоже может быть свой конструктор ОтрядХищных, а у него прототип, и так далее по цепочке... Поиск полей объекта идёт по цепочке прототипов, пока та не закончится. Это и есть наследование.
Code:
Scene_Achievements.prototype = Object.create(Scene_ItemBase.prototype);
Scene_Achievements.prototype.constructor = Scene_Achievements;
Эти строчки как раз делают следующее:
- Объект Scene_Achievements.prototype создаётся как пустой объект, прототипом которого является Scene_ItemBase.prototype. У него пока нет своих полей, но как и Кот, нехватающие поля он пойдёт искать в Scene_ItemBase.prototype.
- Поскольку мы создали Scene_Achievements.prototype не через new, а через Object.create, он не знает свой конструктор... Поэтому мы ставим ему правильный конструктор.
Спасибо сказали: Mur
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
8 года 2 мес. назад #102737
от Mur
Mur ответил в теме MV 1.6: Что нового?
Уффф! Покопавшись на страницах
developer.mozilla.org
на меня нашло озарение, как это теперь может выглядеть плагин, начиная с MV 1.6
Сначала создаём базовый класс. В данном примере он просто сохраняет в переменную value на этапе инициализации (создания):
Затем мы создаём «дитёнка» с родительскими свойствами, но расширяем функционал возможностью чтения/изменения переменной value, а так же добавляем метод log для вывода сообщения в отладчик:
Теперь самое время создать наш новый объект:
Ну теперь к нему можно обращаться внутри базовых классов мейкера:
В идеале конечно было бы классно как-то скрестить [strike]ужа с ежом[/strike] новое описание в стиле class и старое через prototype, что бы не городить огород с этими переопределениями функции, как-то pluginCommand. Но пока у меня нехватает знаний и понятий как эт вообще всё работает ~_~' все эксперименты больше по наитию «а что если сделать вот так? Ух-ты! Работает!»
С нетерпением жду идей по улучшению данного безобразия!
Сначала создаём базовый класс. В данном примере он просто сохраняет в переменную value на этапе инициализации (создания):
Code:
'use strict';
class MurBase {
constructor(value) {
this.value = value;
}
}
Затем мы создаём «дитёнка» с родительскими свойствами, но расширяем функционал возможностью чтения/изменения переменной value, а так же добавляем метод log для вывода сообщения в отладчик:
Code:
class MurChild extends MurBase {
constructor(value) {
super(value + " & " + value);
}
get val() {
return this.value;
}
set val(value) {
this.value = value + " & " + value;
}
log (msg) {
console.log(msg);
}
}
Теперь самое время создать наш новый объект:
Code:
var mc = new MurChild("Test!");
Ну теперь к нему можно обращаться внутри базовых классов мейкера:
Code:
var _MurTest_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_MurTest_Game_Interpreter_pluginCommand.call(this, command, args);
if (command.toLowerCase() === "npc_speech") {
mc.log(mc.val);
mc.val = "Boom!";
mc.log(mc.val);
}
}
В идеале конечно было бы классно как-то скрестить [strike]ужа с ежом[/strike] новое описание в стиле class и старое через prototype, что бы не городить огород с этими переопределениями функции, как-то pluginCommand. Но пока у меня нехватает знаний и понятий как эт вообще всё работает ~_~' все эксперименты больше по наитию «а что если сделать вот так? Ух-ты! Работает!»
С нетерпением жду идей по улучшению данного безобразия!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
8 года 2 мес. назад - 8 года 2 мес. назад #102745
от EvilCat
EvilCat ответил в теме MV 1.6: Что нового?
Всё правильно, только при классовой нотации придётся учитывать ограничение по обращению к this в конструкторе до вызова super,
которое уже обсуждали
, ну, или стыдливо обходить его с помощью перекладывания функционала конструктора на какой-нибудь initialize >_<
Последнее редактирование: 8 года 2 мес. назад пользователем EvilCat.
Спасибо сказали: Mur
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Время создания страницы: 0.098 секунд
