Когда вы вызываете метод Object.keys()
для this
, вы получите все свойства внутри вашего объекта, поэтому keys
будет выглядеть так:
["0", "1", "fakeLen", "length"]
Затем, когда выфильтруя каждый ключ, вы используете скобочные обозначения для каждого элемента в приведенном выше массиве. Итак, вы будете делать следующее:
typeof this["length"] != 'function'
Поскольку length
является геттером (из-за get
), this["length"]
вызовет повторный вызов вашего length
метода, повторяя таким образомпроцесс, пока вы не получите переполнение стека.
const o = {
get length(){
this["length"];
}
};
o.length
Вы можете сделать ваше свойство length
не перечисляемым (как показано Медетом Тлекабилулы), так что когда вы вызываете Object.keys()
, оно не будетпоявится в вашем списке keys
, или вы можете просто удалить "length"
из ваших ключей перед фильтрацией:
const o = {
0: 'hello',
1: 'there',
get length() {
const keys = Object.keys(this).filter(key => key !== "length");
const filtered = keys.filter(key => typeof this[key] != 'function');
return filtered.length;
}
};
console.log(o.length);