HasOwnProperty: примеры (JAVASCRIPT)

Метод hasOwnProperty для проверки свойств объекта
Раздел: Объекты, Прототипы
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-коде.

Расширенные примеры использования

Итерация по собственным свойствам

Пример 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

Создание безопасной функции проверки

Пример javascript
function hasOwn(obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}
const dict = Object.create(null);
console.log(hasOwn(dict, 'key'));
false

Использование с прокси-объектами

Пример javascript
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')); // Метод обходит ловушку has
true

Проверка свойств с нестандартными именами

Пример javascript
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, если свойство равно null
bool(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: проверка происходит на уровне метаданных схемы базы данных, а не во время выполнения кода в объекте.

JS hasOwnProperty function comments

En
HasOwnProperty Returns a boolean indicating whether the object has the specified property as its own property