powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Модули, как изолировать
25 сообщений из 61, страница 1 из 3
Модули, как изолировать
    #39370186
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться, как изолировать переменные и функции в модуле. Пример взят отсюда

Код: php
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.
36.
//Файл "js/scenario.js"</script>
var NewsWidget = (function () {

    var s; // private alias to settings
    function somePrivateFunction() {
        alert("There are " + s.NumArticles + " articles");
    }

    return {
        settings: {
            numArticles: 5,
            moreButton: $('#more-button')
        },

        init: function(id, p) {
            s = this.settings;
            s.numArticles = p;
            
            s = this.settings;
            this.bindUIActions(id);
            somePrivateFunction();

        },

        bindUIActions: function(id) {
            $('#' + id).on("click", function() {
                alert(id);
                NewsWidget.getMoreArticles(s.numArticles);
            });
        },

        getMoreArticles: function(numToGet) {
            alert(numToGet);
        }

    };



И в html:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<html>
<head>
<script type="application/x-javascript" src="js/scenario.js"></script>
</head>
<body>
	<button id="more-button1">121212</button>
	<button id="more-button2">121212</button> 
</body>
<script type="application/x-javascript">

	NewsWidget.init("more-button1", 5);
	NewsWidget.init("more-button2", 10);

</script>





settings у обоих объектов получились одинаковые. Как надо переписать код, чтобы у каждого объекта были свои параметры?
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370245
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuOSПример взят отсюда
а там написано -"Прежде чем продолжить, позвольте признаться, что мой уровень познаний JavaScript далек от мастерства"
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370277
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, видимо, потому и пришел сюда, что ищу правильный путь. Так кто как пишет?
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370351
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuOS,

я как-то так пишу
Код: 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.
36.
37.
38.
39.
40.
41.
42.
(function (scope) 
{

    var s; // private alias to settings

    function somePrivateFunction() {
        alert("There are " + s.NumArticles + " articles");
    }
    function MyWidget () {};

    MyWidget.prototype = {
        settings: {
            numArticles: 5,
            moreButton: $('#more-button')
        },

        init: function(id, p) {
            s = this.settings;
            s.numArticles = p;
            
            s = this.settings;
            this.bindUIActions(id);
            somePrivateFunction();

        },

        bindUIActions: function(id) {
            $('#' + id).on("click", function() {
                alert(id);
                NewsWidget.getMoreArticles(s.numArticles);
            });
        },

        getMoreArticles: function(numToGet) {
            alert(numToGet);
        }

    };

    scope.NewsWidget = new MyWidget();

)(this);
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370401
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mage.lan, и снова объект settings получается глобальным и оба объекта имеют одни и те же данные.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370412
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
 var s; // private alias to settings


выкиньте нахер эту переменную уровня модуля, неужели не очевидно?
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370458
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я уже много что пробовал, всё равно не получается.
Можете исправить образец.
http://codepen.io/virtuos/pen/MbLVvz
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370462
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuOS,

вот я туплю...

Изопропил вам предлагает что-то вроде

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var NewsWidget = (function () {
    return {
        settings: {
            numArticles: 5,
            moreButton: $('#more-button')
        },

        init: function(id, p) {
            this.settings.numArticles = p;
            this.bindUIActions(id);
            somePrivateFunction();

        },

        ...

    };
)()
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39370499
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
структура себя забавно ведет
http://codepen.io/anon/pen/YpBaBZ?editors=1111

вероятно ее надо динамически создавать, а разделение в общем происходит.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39371943
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появился ещё вопрос.
Как можно получить доступ к свойствам объекта, которые были установлены при инициализации? Например, при инициализации выполняется ajax запрос данных с сервера. Ниже условный пример, что хочется.
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
(function (scope) 
{
    function MyWidget (id, p) 
    {
        this._init(id, p);
    };
    MyWidget.prototype = {
        _id: null,
        _num: 0,
        _settings: {
            numArticles: 5,
            moreButton: $('#more-button')
        },    
        _init: function(id, p) 
        {
            this._id = id;
            this._num = p;
            this._attr = 3*p;
            this._settings.numArticles = p;
            this.bindUIActions();
console.info('init', this._id, this._settings.numArticles)
        },      
        bindUIActions: function() 
        {
           $('#' + this._id).on(
              "click", 
              function (e) 
              {
                  console.info('click', this._id, this._num);
                  NewsWidget.getMoreArticles(
                    this._settings.numArticles
                  );
              }.bind(this)
           );
        }    
    }
    function MyWidgetFactory () {};

    MyWidgetFactory.prototype = {

        init: function(id, p) 
        {
            new MyWidget(id, p)
        },
        getMoreArticles: function(numToGet) 
        {
            console.info(numToGet);
        }
    };

    scope.NewsWidget = new MyWidgetFactory();
}
)(this);


var a = NewsWidget.init("more-button1", 50);
var b = NewsWidget.init("more-button2", 100);

console.log(a._attr);
console.log(b._attr);


...
Рейтинг: 0 / 0
Модули, как изолировать
    #39372447
Копайте в сторону ES5 модулей с расширенным синтаксисом и сборщиком типа webpack / browserify
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39372668
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuOS,

Код: javascript
1.
2.
3.
4.
init: function(id, p) 
        {
            return new MyWidget(id, p)
        },



Ну и если вы хотите извне использовать, то не объявляет его приватным

this.attr = 3*p;
...
console.log(a.attr);

подчеркивание - договоренность о том, что этот атрибут для приватного использования.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39372673
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и тут тоже отдаем объект
Код: javascript
1.
2.
3.
4.
function MyWidget (id, p) 
    {
        return this._init(id, p);
    };
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39372702
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне часть свойств нужны приватные, часть публичные.
Прописал так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
MyWidgetFactory.prototype = {

        init: function(id, p) 
        {
            this.__proto__ = new MyWidget(id, url_data, url_template);
        }
}


Получилось вроде то, что надо.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39372703
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
исправлю
Код: javascript
1.
2.
3.
4.
5.
6.
7.
MyWidgetFactory.prototype = {

        init: function(id, p) 
        {
            this.__proto__ = new MyWidget(id, p);
        }
}
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39373076
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuOS,

this.__proto__ - я бы не стал использовать, но дело ваше.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39373325
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lanvirtuOS,

this.__proto__ - я бы не стал использовать, но дело ваше.
Вообще? Или только тут?

А то ведь классика:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Animal() {}

Animal.prototype = {
  eat() {}
}

function Rabbit() {}

Rabbit.prototype = {
  __proto__: Animal.prototype,
  jump() {}
};
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39375163
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

наследование. тупиковая ось развития JavaScript

__proto__ советую не использовать вообще, ссылка введена в кит для решения своих проблем, переопределяя ее "в лоб" вы можете вызывать разные неприятности, типа утечек памяти и пр.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39375457
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lanskyANA,

наследование. тупиковая ось развития JavaScriptОднако интересное мнение. Зачем же тогда extends запилили? Что делает кстати ровно то, что я написал выше.

mage.lan__proto__ советую не использовать вообще, ссылка введена в кит для решения своих проблем, переопределяя ее "в лоб" вы можете вызывать разные неприятности, типа утечек памяти и пр.
Да ладно Вам, вполне себе можно пользоваться, если не хочется на ES6 переходить.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39375736
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДа ладно Вам, вполне себе можно пользоваться, если не хочется на ES6 переходить.

Да не, всё-таки не надо пользоваться. Согласен с mage.lan . Лучше перейти на ES6 или на TypeScript. Варианты есть, зачем извращаться.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39375930
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAДа ладно Вам, вполне себе можно пользоваться, если не хочется на ES6 переходить.

Да не, всё-таки не надо пользоваться. Согласен с mage.lan . Лучше перейти на ES6 или на TypeScript. Варианты есть, зачем извращаться.
А в чём извращение? Открываем консоль браузера и смотрим например на let arr = [] .

Браузеры оптимизированы на поиск по __proto__
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39376183
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА в чём извращение?

В том, что его использование не рекомендуется. В исходном коде его не должно быть, кроме того, он уже давно устаревший. Ну ты и сам это всё знаешь по-лучше меня.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39376191
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

Что скажешь про два больших красных предупреждения вверху? :)
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39376340
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANA,

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

Что скажешь про два больших красных предупреждения вверху? :)Да, движки не заточены на смену "прототипа" на лету.
...
Рейтинг: 0 / 0
Модули, как изолировать
    #39380979
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДа, движки не заточены на смену "прототипа" на лету.
Заточены. Но не через __proto__.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Модули, как изолировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]