2013-05-16 2 views
2

Я уже много программировал на C++ и Java, и в эти дни я больше в Javascript.должны использовать прототипы с самопроизвольной анонимной функцией

Я читал на разных шаблонах определения классов в Javascript и был знаком (но не совсем уверен) с свойством прототипа javascript.

Я также прочитал эту статью, которую я нашел очень полезным:

How Good C# Habits can Encourage Bad JavaScript Habits: Part 1

В частности прокрутка вниз к прямоприменяемой анонимной функции: (Private Public &) раздела, часть 2, которая мне нравится совсем немного ,

Этот шаблон, однако, не использует прототип javascript. Мне интересно, можно или не согласиться?

Например, я объявил «модуль», называемый mycharts, в котором будет несколько диаграмм. Первый график - barChart. У меня есть следующий упрощенный код:

(function(mycharts, $, undefined) { 
    mycharts.barChart = function(containerDiv, data) { 

     // private variables specific to a given chart instance 
     var chart = {}; 
     var _containerDiv = containerDiv; 
     var _data = data;  
     var _barColor = 'blue'; // default color is blue 

     // public getter/setter accessor 
     chart.barColor = function(_) { 
     if (!arguments.length) return _barColor; 
     _barColor = _; 
     return chart; 
     }; 

     // public method 
     chart.render = function() {  
     drawChart(_data.table, _data.values); 
     }; 

     // private method 
     function drawChart(table, values) { 
     ... 
     } 

     return chart; 
}(window.mycharts = window.mycharts || {}, $)); 

В этом примере у меня есть один «класс», BarChart, который имеет три «методы», Цвет прогресса() и визуализации() (общественности) и DrawChart() (частное). Ни один из методов не определяется с использованием свойства прототипа javascript.

Мой вопрос: должен ли я использовать прототип или нет для каких-либо или всех этих методов?

Update: На основе ответов и комментариев здесь, как клиент будет использовать этот модуль:

var chart1 = mycharts.barChart('#chart1', data_set1) 
        .barColor('red'); 

var chart2 = mycharts.barChart('#chart2', data_set2) 
        .barColor('green'); 

chart1.render(); 
chart2.render(); 

И да, я обновил оригинальный фрагмент кода, чтобы вернуть карту (ой, я пропустил эту линию). Таким образом, отдельные экземпляры объекта диаграммы будут возвращаться каждый раз, когда вызывается mycharts.barChart().

Обновление 2: Добавление «общедоступных» методов к прототипу кажется достаточно простым. Просто определите его так же, как описано выше в самоисполняющейся анонимной функции. Например:

chart.prototype.render() = function() {...}; 

Но каков правильный способ сделать это для «частных» методов? Я понимаю, что частное не действует по-настоящему, но исходный код выше делает их использование вне контекста «класса» неудобным, поэтому, если возможно, я хотел бы сохранить мои частные методы как «частные», насколько это возможно.

+1

Как вы используете этот код? Вы возвращаете 'chart' при вызове' mycharts.barChart() '? – alex

+0

Я бы сказал, поставьте его прямо на объект диаграммы. Я не думаю, что вы получаете что-то, используя прототип. – Orangepill

+0

@alex Я обновил код (забыли оператор «return chart;») и добавил пример использования клиента. Похоже, что использование прототипа было бы лучше, поэтому не так много копий функций графика, плавающих вокруг. Звучит правильно? – lostdorje

ответ

0

Если вы всегда возвращаете объект chart, то вы можете извлечь выгоду из определения этих методов на своем prototype один раз и просто вернуть новый объект с его прототипом.

3

Какие качества вы особенно нуждаетесь в употреблении?

Наследование прототипов является хорошим, если вы собираетесь делать несколько экземпляров, в противном случае замыкания (и «шаблон модуля») хороши для одиночных игроков и «частных» участников.

Просто помните, что «частный» в javascript не обеспечивает никакой безопасности, это просто удобство для значений и методов, которые вы не хотите публиковать (например,у вас могут быть методы, предназначенные только для работы в контексте объекта и не используемые извне, или значения, которые должны быть разделены, и вы не хотите передавать их).

Красота javascript заключается в том, что вы можете использовать различные шаблоны OO в одной программе, используя то, что подходит лучше всего в каждом случае. Это не вопрос того или другого, но то, что лучше всего подходит в определенном случае. Просмотрите код более высоко оцененных библиотек, и вы увидите, что большинство (все?) Из них смешивают прототипы, модули и свойства простого объекта.