Во-первых вы не отдалживаете метод, а получаете на него ссылку. Во-вторых ссылка на метод, в вашем случае, находится не в самом объекте, а является свойством прототипа. В-третьих в
JavaScript объекты удаляются по принципу достижимости. Если на объект нет ни одной ссылки, то занимаемая им память будет очищена при первой же возможности. Если же на объект есть ссылки, то это еще не гарантия, что память не будет очищена.
Например:
let foo = {};
let bar = {};
foo.barLink = bar;
bar.fooLink = foo;
foo = bar = null;
На объекты есть ссылки
barLink и
fooLink, но они недостижимы, ведь мы не можем обратиться к этим свойствам, после того как переназначили переменные
foo и
bar,. Поэтому память занимаемая объектами будет очищена, несмотря на наличие ссылок.
Ваш массив будет уничтожен сборщиком мусора сразу же после выполнения строки в которой используется.
Другое дело, если мы сначала забиндим метод на наш объект:
class Person {
constructor(name) {
this.name = name;
}
printName() {
console.log(this.name);
}
}
let john = new Person('John');
const obj = {};
obj.printJohnName = john.printName.bind(john);
john = null;
obj.printJohnName(); // 'John'
Объект ранее доступный по ссылке
john не будет удален, так как мы
забиндили на него функцию и в ней есть скрытое свойство
[[BoundThis]], ссылающееся на него: