Оператор in
можно использовать для проверки, существует ли указанное свойство в объекте (или в любом объекте его цепочки прототипов):
const o1 = {'foo': 0};
console.log('foo' in o1);
const o2 = {};
console.log('foo' in o2);
const o3 = Object.create(o1);
console.log('foo' in o3);
Функциональность проверки наличия приватных свойств расширяет оператор in
, чтобы поддерживать приватные поля классов:
class A {
static test(obj) {
console.log(#foo in obj);
}
#foo = 0;
}
A.test(new A());
A.test({});
class B {
#foo = 0;
}
A.test(new B());
Так как приватные имена доступны только внутри класса, который их определяет, тестирование должно также выполняться внутри класса, например, в методе, как static test
выше.
Экземпляры подклассов наследуют приватные поля от родительского класса в качестве собственных свойств:
class SubA extends A {};
A.test(new SubA());
Но объекты, созданные с помощью Object.create
(или объекты, которым позднее установлены прототипы с помощью сеттера __proto__
или Object.setPrototypeOf
), не получают приватные поля в качестве собственных свойств. Поскольку поиск приватных полей работает только на собственных свойствах, оператор in
не находит эти унаследованные поля: