Комментарии 16
Достучаться до приватных членов класса, как и до абстрактных классов родителей, будет проблематично
Очень странное желание. Приватные члены сделаны приватными, потому что они в будущем могут измениться, и полагаться на них нельзя.
Мне кажется, что если разработчик использует нотацию приватных членов (в Closure или в Typescript), то он воспринимает отсутсвие в js приватных свойств, как недостаток и решает его с помощью компилятора/транспайлера. Скрытие данных или реализации с помощью приватных свойств и методов даёт разработчику преимущество не думать об обратной совместимости, когда он захочет их поменять.
Насчёт @protected
не понял, там в коде есть @protected
и @private
у одних и тех же свойств? Я думаю, что это ошибка.
Я код OpenLayers не модифицировал, но с Closure Compiler/Library работал плотно, и у меня этой проблемы не было. Возможно, есть какие-то особенности, про которые я не знаю.
Я все такие телодвижения делал до сборки, так что не смогу помочь, к сожалению. И использовал Closure как программист-пользователь, т.е. не настраивал окружение.
Если вы это будете делать средствами javascripta, то, думаю, сможете. Ведь собранный код — это javascript, и там нет @protected
, @abstract
, @private
и т.д.
Лично я на вашем месте попробовал бы typescript, с ним должно стать всё намного проще (например, https://stackoverflow.com/a/40732068/8159386)
Во-первых, если из-за технических ограничений разработчик не может сделать настоящий приватный член, и поэтому просто помечает его, как приватный, он как раз и имеет в виду, что полагаться на него нельзя и вообще трогать его нельзя. Так что желание достучаться до приватных членов класса — всё ещё странное.
Во-вторых в JS технически нет проблем с тем, чтобы сделать приватные члены класса. И добраться до них, в отличии от какой-нибудь джавы, будет вообще нереально.
Простой пример по коду Leaflet.
Есть класс Layer, у него есть свойство _map, судя по "_" оно не публичное.
Есть класс наследник — LayerGroup, он использует свойство this._map от потомка. Т.е. по сути своей оно защищенное (protected), объявлено как приватное, но фактически оно публичное, т.к. к нему можно обратится извне.
Т.е. по сути своей оно защищенное (protected)
Так и есть.
объявлено как приватное
Что вы имеете в виду, когда говорите, что оно объявлено, как приватное? Что у него underscore перед именем?
но фактически оно публичное
Я хотел отметить, что в js нет проблем с тем, чтобы сделать его приватным фактически.
Для иллюстрации приведу минимальный код, который нужен чтобы просто показать карту. Ничего с ней не делать — просто создать и показать один тайловый слой. Почувствуйте разницу, как говорится.
// Leaflet
var map1 = L.map('map1', {
center: [55.8, 37.6],
zoom: 12,
});
L.tileLayer('http://sometileserver.com/{z}/{x}/{y}.png', {
attribution: '© <a href="http://sometileserver.com">sometileserver.com</a>',
})
.addTo(map1);
// OpenLayers
var map2 = new ol.Map({
target: 'map2',
layers: [
new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'http://sometileserver.com/{z}/{x}/{y}.png',
attributions: new ol.Attribution({
html: '© <a href="http://sometileserver.com">sometileserver.com</a>',
}),
}),
})
],
view: new ol.View({
center: ol.proj.fromLonLat([37.6, 55.8]),
zoom: 12,
}),
});
Я имел дело (понемногу) почти со всеми популярными картографическими апи — имхо, Leaflet рулит и бибикает.
Leaflet 1.x.x vs Openlayers 4.x.x. Часть 1. Исходный код