Я уже много программировал на 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() {...};
Но каков правильный способ сделать это для «частных» методов? Я понимаю, что частное не действует по-настоящему, но исходный код выше делает их использование вне контекста «класса» неудобным, поэтому, если возможно, я хотел бы сохранить мои частные методы как «частные», насколько это возможно.
Как вы используете этот код? Вы возвращаете 'chart' при вызове' mycharts.barChart() '? – alex
Я бы сказал, поставьте его прямо на объект диаграммы. Я не думаю, что вы получаете что-то, используя прототип. – Orangepill
@alex Я обновил код (забыли оператор «return chart;») и добавил пример использования клиента. Похоже, что использование прототипа было бы лучше, поэтому не так много копий функций графика, плавающих вокруг. Звучит правильно? – lostdorje