Вот несколько изменений, которые вы можете сделать
Вместо того, чтобы делать
document.querySelector("#selectionButton span:first-child").textContent
, вы можете сделать
let getButtonSpan = document.getElementById('selectionButton').firstElementChild;
, это даст первый потомок внутри этого элемента dom с идентификатором selectionButton
Вы можете использовать forEach
, хотя обычный цикл for
одинаково хорош. Используйте аргумент forEach
, чтобы получить якорный тег dom & amp; добавить слушатель события к нему. Нажмите на него, чтобы получить текст, используя innerHTML
& amp; установите его для первого потомка кнопки.
Кроме getAttribute, вы также можете использовать набор данных для извлечения свойства data
из домена.
В вашем коде, который заменяет jquery, вы используете $(this).data("parentid")
, который нарушает вашу цель
let getButtonSpan = document.getElementById('selectionButton').firstElementChild;
document.getElementById('selectionList').querySelectorAll('a').forEach(function(item) {
item.addEventListener('click', function() {
getButtonSpan.innerHTML = item.innerHTML;
let selectedParentID = item.dataset.parentid;
let selectedType = item.dataset.type;
if (selectedParentID && selectedType) {
doSomeThing(selectedParentID, selectedType);
}
})
})
function doSomeThing(a, b) {
console.log(`selectedParentID : ${a} & selectedType :${b}`)
}
Ande, я думаю, что Вы приближаетесь к этому - игре слов, НЕ предназначенной - с ненужной степенью абстракции. Я думаю это (по моему скромному мнению), ненужный уровень абстракции - то, что вызывает "проблему" здесь. Вы, возможно, приближаетесь к этому от математического теоретического подхода, где многие из нас приближаются к этому от "программиста, пытающегося решить проблемы" подход. Я полагаю, что это различие в подходе вызывает разногласия.
Когда программисты смотрят на практичность и как на самом деле реализовать что-то, существует неоднократно, когда Вам нужен некоторый полностью произвольный объект, фактический экземпляр которого полностью не важен. Это просто не может быть пустым. Примером, который я дал в комментарии другому сообщению, является реализация *Set
(*
== Hash
или Concurrent
или введите предпочтительный), который обычно делается при помощи поддержки *Map
и использование Map
ключи как Набор. Вы часто не можете использовать null
как Map
значение, поэтому что обычно делается, должно использовать помехи Object
экземпляр как значение, которое будет проигнорировано и никогда не использоваться. Однако некоторый непустой заполнитель необходим.
Другое общее использование с synchronized
ключевое слово, где некоторые Object
необходим для синхронизации на, и Вы хотите удостовериться, что Ваш объект синхронизации является полностью частным для предотвращения мертвой блокировки, где различные классы неумышленно синхронизируются на той же блокировке. Очень общая идиома должна выделить a private final Object
использовать в классе в качестве блокировки. Честно говоря, с Java 5 и java.util.concurrent.locks.Lock
и связанные дополнения, эта идиома в известной мере менее применима.
Исторически, было довольно полезно в Java иметь Object
будьте instantiable. Вы могли сделать правильное замечание, что с небольшими изменениями в дизайне или с небольшими изменениями API, это больше не будет необходимо. Вы, вероятно, корректны в этом.
И да, API, возможно, обеспечил a Placeholder
класс, который расширяется Object
не добавляя ничего вообще, чтобы использоваться в качестве заполнителя в целях, описанных выше. Но - если Вы расширяетесь Object
но ничего не добавляя, каково значение в классе кроме разрешения Object
быть абстрактным? Математически, теоретически, возможно, можно было найти значение, но практично, какое значение оно добавит, чтобы сделать это?
Существуют времена в программировании, где Вам нужны объект, некоторый объект, любой конкретный объект, который не является несуществующим, что-то, через что можно выдержать сравнение ==
и/или .equals()
, но Вам просто не нужна никакая другая функция к этому объекту. Это существует только для служения в качестве уникального идентификатора и иначе абсолютно ничего не делает. Object
удовлетворяет эту роль отлично и (по моему скромному мнению) очень чисто.
Я предположил бы, что это - часть причины почему Object
не был объявлен кратким обзором: Для него непосредственно полезно не быть.
Объект указывает методы, которые должны реализовать классы, расширяющие его, чтобы быть полезными? Нет, и для этого это не должно быть абстрактно.
Понятие класса, являющегося абстрактным, имеет четко определенное значение, которое не применяется к Объекту.
Object
полезно, даже если это не имеет никакого состояния или поведения характерными для него.
Одним примером было бы свое использование в качестве универсальной защиты, это используется для синхронизации:
public class Example {
private final Object o = new Object();
public void doSomething() {
synchronized (o) {
// do possibly dangerous stuff
}
}
}
В то время как этот класс немного прост в своей реализации (не очевидно здесь, почему полезно иметь явный объект, Вы могли просто объявить метод synchronized
) существует несколько случаев, где это действительно полезно.
Можно инстанцировать Object
для блокировок синхронизации:
Object lock = new Object();
void someMethod() {
//safe stuff
synchronized(lock) {
//some code avoiding race condition
}
}
void someOtherMethod() {
//safe code
synchronized(lock) {
//some other stuff avoiding race condition
}
}
Я не уверен, что это - причина, но она позволяет (или позволенный, поскольку существуют теперь лучшие способы сделать ее) для Объекта, который будет использоваться в качестве блокировки:
Object lock = new Object();
....
synchronized(lock)
{
}
Вы никогда не знаете, когда Вы могли бы хотеть использовать простой объект в качестве заполнителя. Думайте о нем так же как наличие нуля в числовой системе (и пустой указатель не работает на это, так как пустой указатель представляет отсутствие данных).
Как Объект является больше оскорбительным, чем пустой указатель?
Это делает хороший маркер места (как хороший как пустой указатель так или иначе).
Кроме того, я не думаю, что это был бы хороший дизайн для создания объектного краткого обзора без абстрактного метода, который должен пойти на него.
Я не говорю, что пустой указатель является лучше не бывает - я прочитал статью на днях "Изобретателя", обсуждающего стоимость/значение наличия понятия пустого указателя... (Я даже не думал, что пустой указатель был inventable! Я предполагаю, что кто-то где-нибудь мог утверждать, что изобрел нуль..) просто, что способность инстанцировать Объекта не хуже, чем способность передать пустой указатель.