Что применимо для использования JavaScript-геттеров? [Дубликат]

Вот почему динамически созданные элементы не реагируют на клики & nbsp;:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

В качестве обходного пути вы должны прослушивать все клики и проверять исходный элемент & nbsp;:

var body = $("body");
var btnB = $("<button>B</button>");
var btnC = $("<button>C</button>");
// Listen to all clicks and
// check if the source element
// is a `<button></button>`.
body.on("click", function (ev) {
  if ($(ev.target).is("button")) {
    console.log(ev.target);
  }
});
// Now you can add any number
// of `<button></button>`.
body.append(btnB);
body.append(btnC);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

Это называется «Event Delegation». Хорошие новости, это встроенная функция в jQuery: -)

var i = 11;
var body = $("body");
body.on("click", "button", function () {
  var letter = (i++).toString(36).toUpperCase();
  body.append($("<button>" + letter + "</button>"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

15
задан NL500 20 February 2017 в 11:52
поделиться

1 ответ

Разница между использованием геттера или сеттера и использованием стандартной функции заключается в том, что getters / seters автоматически вызывается при назначении. Таким образом, он выглядит так же, как и обычное свойство, но за кулисами у вас может быть дополнительная логика (или проверки) для запуска непосредственно перед или после назначения.

Итак, если вы решили добавить эту дополнительную логику в у одного из существующих свойств объекта уже есть ссылки, вы можете преобразовать его в стиль getter / setter, не изменяя остальную часть кода, который имеет доступ к этому свойству.

10
ответ дан Bulent Vural 20 August 2018 в 08:07
поделиться
  • 1
    И вопрос в том, почему foo.bar = baz с использованием сеттера лучше, чем foo.setBar(baz) ... – deceze♦ 20 February 2017 в 11:59
  • 2
    Вопрос несколько отличался от того, что вы все равно понимаете, добавил второй абзац, чтобы разъяснить эту выгоду. – Bulent Vural 20 February 2017 в 12:05
  • 3
  • 4
    Нет, нет. Я говорю, что сегодня я пишу новый объект, у которого пока нет ссылок, и я предпочитаю писать get foo() / set foo() вместо getFoo() / setFoo() ... почему я? – deceze♦ 20 February 2017 в 12:12
  • 5
    Вы не можете использовать назначения, такие как myObj.foo = «некоторые данные» с getFoo, setFoo. Вам всегда нужно вызывать эти функции. И если вы передумаете позже, скажите добавить дополнительную логику, вам нужно преобразовать все ссылки на вызовы функций. – Bulent Vural 20 February 2017 в 12:19
Другие вопросы по тегам:

Похожие вопросы: