HasOwnProperty: примеры (JAVASCRIPT)
hasOwnProperty(v: PropertyKey): booleanОписание метода hasOwnProperty
Метод hasOwnProperty() является встроенной функцией объектов в JavaScript. Он предназначен для определения, содержит ли объект указанное свойство как собственное, а не унаследованное из цепочки прототипов.
Использование метода актуально при итерации по свойствам объекта с помощью цикла for...in, когда требуется исключить унаследованные свойства. Также метод применяется для проверки существования конкретного свойства перед его использованием.
Метод принимает один обязательный аргумент:
- prop – строка или символ (Symbol), представляющая имя проверяемого свойства.
Возвращаемое значение – логическое (boolean): true, если объект имеет указанное собственное свойство, и false в противном случае, включая ситуации, когда свойство унаследовано или отсутствует.
Основные примеры применения
Проверка собственного свойства
const obj = { a: 1, b: 2 };
console.log(obj.hasOwnProperty('a'));true
Сравнение с унаследованным свойством
function MyClass() {
this.ownProp = 'value';
}
MyClass.prototype.inheritedProp = 'prototype';
const instance = new MyClass();
console.log(instance.hasOwnProperty('ownProp'));
console.log(instance.hasOwnProperty('inheritedProp'));true false
Использование с символами
const sym = Symbol('id');
const obj = { [sym]: 123 };
console.log(obj.hasOwnProperty(sym));true
Проверка несуществующего свойства
const obj = {};
console.log(obj.hasOwnProperty('undefinedProperty'));false
Похожие методы в JavaScript
Object.hasOwn() – статический метод, представленный в ES2022. Он выполняет аналогичную функцию, но является более безопасным, так как работает с объектами, у которых мог быть переопределен hasOwnProperty. Предпочтительнее использовать в современных проектах.
Оператор in – проверяет наличие свойства в объекте, включая унаследованные. Используется, когда требуется учитывать свойства из цепочки прототипов.
Object.keys() – возвращает массив только собственных перечисляемых свойств. Применяется для получения списка свойств с последующей проверкой через includes().
Типичные ошибки при работе
Использование не в качестве метода объекта
const obj = null;
console.log(obj.hasOwnProperty('prop'));TypeError: Cannot read properties of null
Проверка свойства, которое является hasOwnProperty
const obj = { hasOwnProperty: 'custom' };
console.log(obj.hasOwnProperty('prop'));TypeError: obj.hasOwnProperty is not a function
Решение: использовать Object.prototype.hasOwnProperty.call(obj, 'prop').
Передача нестрокового значения
const obj = { '123': 'number' };
console.log(obj.hasOwnProperty(123)); // Приведение типа происходитtrue
Однако для символов приведение не работает, что может привести к ложному результату.
Изменения в последних версиях
В ES2022 представлен статический метод Object.hasOwn() как альтернатива. Он решает проблему с объектами, где hasOwnProperty может быть переопределен или удален. Метод принимает объект и свойство, возвращает логическое значение.
const obj = Object.create(null);
obj.prop = 'exists';
console.log(Object.hasOwn(obj, 'prop'));true
Этот метод рекомендуется к применению в современном JavaScript-коде.
Расширенные примеры использования
Итерация по собственным свойствам
const user = {
name: 'Alex',
age: 30
};
Object.prototype.country = 'RU';
for (let key in user) {
if (user.hasOwnProperty(key)) {
console.log(key);
}
}name age
Создание безопасной функции проверки
function hasOwn(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
const dict = Object.create(null);
console.log(hasOwn(dict, 'key'));false
Использование с прокси-объектами
const target = { a: 1 };
const handler = {
has(target, prop) {
console.log(`Проверка: ${prop}`);
return prop in target;
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.hasOwnProperty('a')); // Метод обходит ловушку hastrue
Проверка свойств с нестандартными именами
const obj = {
'123number': true,
'space prop': false,
'': 'empty key'
};
console.log(obj.hasOwnProperty(''));
console.log(obj.hasOwnProperty('space prop'));true true
Аналоги в других языках программирования
PHP: property_exists и isset
class MyClass {
public $prop = 'value';
}
$obj = new MyClass();
var_dump(property_exists($obj, 'prop')); // Проверяет свойство, даже если null
var_dump(isset($obj->prop)); // Возвращает false, если свойство равно nullbool(true) bool(true)
Python: hasattr и проверка словаря
class MyClass:
def __init__(self):
self.prop = 'value'
obj = MyClass()
print(hasattr(obj, 'prop')) # Проверяет атрибут, включая унаследованные
print('prop' in obj.__dict__) # Проверяет только собственные атрибутыTrue True
MySQL: проверка существования столбца
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table' AND COLUMN_NAME = 'column';Отличие от JavaScript: проверка происходит на уровне метаданных схемы базы данных, а не во время выполнения кода в объекте.