#javascript #class #methods #swap
Вопрос:
Узнав о занятиях, я заметил интересное явление, не могли бы вы объяснить, пожалуйста, как это происходит. В классе Infected я объявил функцию infect(кто-то). В моем примере Марии.инфекция(Джон) — хотя я понимаю, что Мэри заражается (Мэри-это объект, я вызываю функцию, Мэри-объект, в настоящее время я работаю, меняется Марии стоимости имущества), я не понимаю, как Джон заражается от Мэри (Иоанна служит лишь аргументом в текущем вызове функции).
Другими словами: mary.заразить(джон) — я вызываю эту функцию » от «объекта Мэри (мэри-это «этот» объект), так что же здесь происходит, что я могу изменить значение болезней Джона?
Я думал так: если я использую джона просто как параметр (аргумент) в вызове функции мэри, все, что я могу сделать, это извлечь определенные значения из джона (например, его болезни), но я не ожидал, что смогу в тот же момент получить доступ к Джону и изменить значения джона. Просто мне это показалось немного нелогичным.
Здорово, что мы можем вот так обмениваться значениями между двумя объектами. Но я не понимаю, как это работает.
class Infected { constructor(name, diseases) { this.name = name; this.diseases = diseases; } infect(somebody) { const thisDiseases = this.diseases; this.diseases = this.diseases.concat(somebody.diseases); somebody.diseases = somebody.diseases.concat(thisDiseases); } } const mary = new Infected('Mary', ['herpes', 'hepatitis']); const john = new Infected('John', ['flu', 'syphilis']); mary.infect(john); mary.diseases -gt; ['herpes', 'hepatitis', 'flu', 'syphilis'] john.diseases -gt; ['flu', 'syphilis', 'herpes', 'hepatitis']
Комментарии:
1. Когда вы передаете
john
в качестве аргумента, вы фактически передаете ссылку на объект, а не копию. Обаjohn
иsomebody
указывают на один и тот же объект в памяти, поэтому изменениеsomebody
вinfect
отражается и вjohn
ссылке.