Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Модули, как изолировать / 25 сообщений из 61, страница 1 из 3
19.12.2016, 14:39
    #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
19.12.2016, 15:04
    #39370245
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
virtuOSПример взят отсюда
а там написано -"Прежде чем продолжить, позвольте признаться, что мой уровень познаний JavaScript далек от мастерства"
...
Рейтинг: 0 / 0
19.12.2016, 15:19
    #39370277
virtuOS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
Изопропил, видимо, потому и пришел сюда, что ищу правильный путь. Так кто как пишет?
...
Рейтинг: 0 / 0
19.12.2016, 16:16
    #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
19.12.2016, 16:56
    #39370401
virtuOS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
mage.lan, и снова объект settings получается глобальным и оба объекта имеют одни и те же данные.
...
Рейтинг: 0 / 0
19.12.2016, 17:07
    #39370412
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
Код: sql
1.
 var s; // private alias to settings


выкиньте нахер эту переменную уровня модуля, неужели не очевидно?
...
Рейтинг: 0 / 0
19.12.2016, 17:59
    #39370458
virtuOS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
Да я уже много что пробовал, всё равно не получается.
Можете исправить образец.
http://codepen.io/virtuos/pen/MbLVvz
...
Рейтинг: 0 / 0
19.12.2016, 18:03
    #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
19.12.2016, 18:32
    #39370499
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
структура себя забавно ведет
http://codepen.io/anon/pen/YpBaBZ?editors=1111

вероятно ее надо динамически создавать, а разделение в общем происходит.
...
Рейтинг: 0 / 0
21.12.2016, 14:08
    #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
21.12.2016, 23:15
    #39372447
Модули, как изолировать
Копайте в сторону ES5 модулей с расширенным синтаксисом и сборщиком типа webpack / browserify
...
Рейтинг: 0 / 0
22.12.2016, 11:28
    #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
22.12.2016, 11:30
    #39372673
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
и тут тоже отдаем объект
Код: javascript
1.
2.
3.
4.
function MyWidget (id, p) 
    {
        return this._init(id, p);
    };
...
Рейтинг: 0 / 0
22.12.2016, 11:48
    #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
22.12.2016, 11:50
    #39372703
virtuOS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
исправлю
Код: javascript
1.
2.
3.
4.
5.
6.
7.
MyWidgetFactory.prototype = {

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

this.__proto__ - я бы не стал использовать, но дело ваше.
...
Рейтинг: 0 / 0
22.12.2016, 22:10
    #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
26.12.2016, 12:08
    #39375163
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модули, как изолировать
skyANA,

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

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

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

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

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

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

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

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

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

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

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

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


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