С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript: Фреймворки
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 21

Prototype Наследование через прототипирование

13.10.2015, 17:57. Показов 2460. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Есть написанный плагин для jquery. Хочу разделить плагин на 3 плагина, чтобы они использовали общий код. Для этого в функцию хочу положить общие методы, константы и т.д. Установить прототип для плагина, чтобы унаследовать функции из общей функции, но почему-то нет доступа к вложенным в общую функцию методам. Подскажите как сделать выше описанное. Вот как пробовал:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function BasicWizard(){
    var error_setter = {
            '1' : 1
        },
        ok_setter = {
            '2' : 2
        },
        nothing_setter = [];
}
 
(function ( $ ){
    var error_setter = BasicWizard.error_setter;
    this.prototype = BasicWizard;
     
    $.fn.card_payment_form = function( ) {
        console.log(ok_setter);
        console.log(error_setter);
    };
})( JQuery );
Вызов:
JavaScript
1
$('div').card_payment_form();
Результат:
JavaScript
1
2
undefined
undefined
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2015, 17:57
Ответы с готовыми решениями:

Prototype Наследование
Помогите разобраться с наслодованием в JS. Например в яве я бы сделал так: класс GameObject от него класс Player, Mob, GameItems. В...

Какой из методов рациональнее использовать: Array.prototype.indexOf() или String.prototype.indexOf()
функции передаётся буква алфавита в нижнем регистре и она должна вернуть следующую по очереди букву алфавита в нижнем регистре при этом...

Реализация паттерна Prototype в MVC через открытые члены
Всем доброго времени суток! Реализую приложение с родительской формой и несколькими дочерними. Для каждой дочерней формы применяется...

5
Ренегат
Эксперт HTML/CSS
 Аватар для BANO
1740 / 1085 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
13.10.2015, 22:32
lexu, ошибка здесь
JavaScript
1
var error_setter = BasicWizard.error_setter;
у функции нету такого свойства


как я понял вы вообще не поняли что такое классы в js
вот, почитайте, поймите как это работает, а делите плагин на модули

Добавлено через 1 минуту
Цитата Сообщение от lexu Посмотреть сообщение
this.prototype = BasicWizard;
устанавливает объекту window.prototype равным функции

это непрофессионализм в чистейшем виде
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 21
14.10.2015, 11:22  [ТС]
BANO, я действительно не понимаю как установить прототип функции, чтобы наследовать методы прототипа. Я пришел из ООП языка и достаточно сложно освоить.
P.S. this.prototype = BasicForm устанавливает прототип в div, а не в window. Я пробовал вот такой вариант:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function BasicForm() {
    var
        ok_setter = [],
        error_setter = [],
        nothig_setter = [];
        
    var init = function () {
        throw new Exception('not initialized');
    };
}
 
function WizzardFrom() {
 var init = function () {
        // Тут инициализация всей формы, как было раньше
    };
} 
 
(function( $ ){
    WizzardFrom.prototype = BasicForm;
    
    $.fn.card_payment_form = function( method ) {
        var form = new WizzardFrom();
        
 
        if ( typeof method === 'object' || ! method ) {
            var _return = BasicForm.init.apply( form, arguments );
 
            return _return;
        } 
        else {
            $.error( 'Метод с именем ' +  method + ' не существует для jQuery.card_payment_form' );
        }    
 
    };
}) (JQuery);
Тоже нет доступа к методам BasicForm из анонимной функции
0
Ренегат
Эксперт HTML/CSS
 Аватар для BANO
1740 / 1085 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
14.10.2015, 19:15
lexu, зачем вставлять в прототип window?
объясните пожалуйста

Добавлено через 41 секунду
учитывая, что у window нет прототипа
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 21
15.10.2015, 11:08  [ТС]
Желанием было вставить в функцию прототипом другую, чтобы наследовать ее методы и свойства. Хоть я и понимал, что в this у меня объект window, но других предположений как это сделать не было. Вот и взял конструкцию из ООП. На самом деле я ожидал совета, а не вопроса почему я делаю именно так.
В итоге нашел на форуме, что если в BasicForm в его прототип установить методы, то при простановке прототипа в другую функцию становятся доступны методы этого BasicForm:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function BasicForm() {
    BasicForm.prototype.ok_setter = [];
    var error_setter = [];
}
var Form = new BasicForm();
Form .init() = function(){
     console.log(ok_setter);
     console.log(error_settor);
}
 
Form.init();
Единственное что мне непонятно - это почему нужно именно в прототип BasicForm указывать свойства... У вас есть ответ или это просто особенность прототипирования? По какой причине доступен ok_setter и не доступен error_settor?
0
Ренегат
Эксперт HTML/CSS
 Аватар для BANO
1740 / 1085 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
16.10.2015, 00:17
Цитата Сообщение от lexu Посмотреть сообщение
По какой причине доступен ok_setter и не доступен error_settor?
это особенность языка, вы наверное с другова переходили, тк вот

в js классов нет, и все стандартные методы доступные в других языках тут посылаются на...
в js всё - объект(строка, функция, число, и тд)
у всех объектов можно задать и получить свойство

ваш код может и рабочий, но я его вижу как слова "Папо Вася пошла на улицо", вроде понятно, но не грамматно

тк вот, когда мы делаем объект, мы на самом деле вызываем функцию, и this передаём ей как пустой объект
и результатом выполнения этой функции будет то, что она поставила в свойства объекта
код примерно такой
JavaScript
1
2
3
4
5
function Class(tem){
    this.tem=tem;
}
var a=new Class; // пустой класс, типа "класс" имеющий свойство tem равное undefined
var b=new Class("tem") // класс имеющий свойство tem равное "tem"
а теперь прототипы
обычно в функции конструкторе(в прошлом примере это class) задаются параметры, которые генерятся динамически, в звисемости от параметров, переданных при инициализации
JavaScript
1
2
3
4
5
function Class(tem){
    this.tem=tem*tem;
}
a=new Class(1); // a.tem==1
b=new Class(2); // b.tem==4
а остальные свойства и методы, которые у всех классов одинаковые, записываются в прототип
JavaScript
1
2
3
4
5
6
7
8
9
function Class(tem){
    this.tem=tem*tem;
}
Class.prototype.log=function(){
    alert(this.tem)
}
a=new Class(1); // a.tem==1
b=new Class(2); // b.tem==4
a.log()

а ещё меня поразила строчка
JavaScript
1
Form .init() = function()
она выдаст ошибку(ds наверное с с++ перешли к нам) поскольку у класса НЕТ ПОКА ТАКОГО МЕТОДА, А ВЫ ЕГО УЖЕ ВЫЗЫВАЕТЕ

короче ваш код не правильный совершенно
вот как надо
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
function BasicForm(){}; // создаём пустой конструктор класса
BasicForm.prototype={ // и задам прототип для класса
    init: function(){
        console.log(this.ok_setter);
        console.log(this.error_settor);
    },
    ok_setter: [],
    error_setter: []
};
 
var Form=new BasicForm;
Form.init();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2015, 00:17
Помогаю со студенческими работами здесь

Прототипирование сайта
Подскажите, кто какой программой пользуется для прототипирования сайтов? Что удобнее для одностраничного сайта и для полноценного...

прототипирование от класса элементов
Доброго, подскажите в чем трабл. Задаю функцию объекту через прототипирование класса: HTMLElement.prototype.some = function(){} И...

Прототипирование с дешевым покрытием краевых разьемов
Не могу найти производителя плат, у которого есть дешевое покрытие краевых разьемов(Gold Fingers). Подскажите, есть такие вообще? И...

Прототипирование платы с использованием SMD компонентов
Как вы прототипируете платы с использованием SMD компонентов? Сначала делаете такую же на компонентах для сквозного монтажа или как-то еще?

прототипирование алгоритма вычисления координат/угла поворота
Не нашел отдельной ветки на форуме. Ищу помощи в решении задачи моделирования алгоритма вычисления координат и угла поворота по данным силы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru