Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   использование prototype для создания конструктора обьекта (https://javascript.ru/forum/misc/63346-ispolzovanie-prototype-dlya-sozdaniya-konstruktora-obekta.html)

greenrow 02.06.2016 10:32

использование prototype для создания конструктора обьекта
 
Добрый день!

Решил впервые попробовать создать свою небольшую библиотеку.

Вот как у меня вызывается новые обьект (без необязательных аргументов)

var loader= new FileLoader(
            '#main_content', //root

            function(){alert('callback ok')}  //callback
        );

Вот как у меня вызывается новые обьект (с необязательными аргументами)

var loader= new FileLoader(
            '#main_content',  //root
    
            {
             fileinfo:{                     
                 root:'.fileloader_info', 
                 length:files_length, //array
                 progress:true,
                 filename:file_names //array
             },
            settings:{hidefoto:true,'description':true} 
                
            },
            function(){alert('callback ok')}//callback fnc
        );


проблема в том что сам обьект создан с использование прототипов, но они сами используютя только внутри обьекта и вызываются исходя параметров обьекта, которых может быть много и не все обязательные.
Например

Если указан в параметре при создание нового обьекта

{fileinfo:{
filename:file_names //array
}
}


В главном обьекте вызывается

FileLoader.prototype.filename=function(arr,i){
                  
           /*код*/
              }


То есть этот прототип нельзя вызвать так

var loader= new FileLoader
loader.filename()



Вопрос - можно ли так формировать архитектуру библиотеки, или лучше все прототипы поменять на методы и разместить их все в одном главном методе конструкторе например _init() ?

Rise 02.06.2016 12:01

Цитата:

Сообщение от greenrow (Сообщение 418305)
То есть этот прототип нельзя вызвать так

Почему нельзя, ведь метод в прототипе?

greenrow 02.06.2016 12:39

Да, если код изменит то можно реализовать, но сейчас я разбираю arguments- потом вызов прототипов.

По сути на данный момент у меня есть только конструктор,который формирует новый обьект.(Как например у google.Map). А прототипы используются для упрощения восприятия и написание кода и не предназначены для их внешнего вызова. ( типо как protected function)

Можно ли так делать или это неверный подход?

Допустим если эту доработанную библиотеку выложить в доступ и написать к ней мануал,где будет указано только описание конструктора

Botik21 02.06.2016 15:05

Не делайте этого пока сами не разобрались что и как надо делать.

Из вашего текста не понятна что вы хотите и какая у вас проблема.
Цитата:

Сообщение от greenrow (Сообщение 418305)
проблема в том что сам обьект создан с использование прототипов, но они сами используютя только внутри обьекта и вызываются исходя параметров обьекта, которых может быть много и не все обязательные.

Объект не может быть создан с помощью прототипов, если только мы говорим не о наследовании.
"они сами", – это видимо методы заложенные в прототипе. По хорошему если это методы должны быть по задумке приватными их надо вынести из прототипа и сделать доступными только из области видимости объекта.

Rise 02.06.2016 17:06

Цитата:

Сообщение от greenrow (Сообщение 418317)
А прототипы используются для упрощения восприятия и написание кода и не предназначены для их внешнего вызова.

Не думаю что это нормально...

ruslan_mart 02.06.2016 17:55

greenrow,

var FileLoader = (function() {


    function FileLoader(..., ...) {
         this.test(); //Вызов публичного метода

         Private.test3.call(this); //Вызов приватного метода
    }

    var Public = { //Публичные (внешние) методы
        test: function() {

        },
        test2: function() {

        }
    };

    var Private = { //Приватные (внутренние) методы
        test3: function() {

        }
    };

 
    FlieLoader.prototype = Public;
    return FlieLoader;

})();



var fileLoader = new FileLoader;

fileLoader.test(); //Ok
fileLoader.test2(); //Ok
fileLoader.test3(); //Error

ruslan_mart 02.06.2016 20:03

рони, упс, опечаточка. :)


Часовой пояс GMT +3, время: 07:56.