Невозможно преобразовать null или undefined в объект при использовании hasOwnProperty

Вопрос: Я пытаюсь использовать hasOwnProperty более элегантным способом. У меня есть этот код здесь, который отлично работает: var obj = { a: 2, b: 7, bamboo: 22 }; var keys = Object.keys(obj).filter(key => obj.hasOwnProperty(key)); // keys: [ "a", "b", "bamboo" ] Однако, когда я пытаюсь передать obj.hasOwnProperty как стенографию (которая должна работать), она не ведет

Вопрос:

Я пытаюсь использовать hasOwnProperty более элегантным способом.

У меня есть этот код здесь, который отлично работает:

var obj = { a: 2, b: 7, bamboo: 22 }; var keys = Object.keys(obj).filter(key => obj.hasOwnProperty(key)); // keys: [ «a», «b», «bamboo» ]

Однако, когда я пытаюсь передать obj.hasOwnProperty как стенографию (которая должна работать), она не ведет себя так, как я ожидаю.

var keys = Object.keys(obj).filter(obj.hasOwnProperty); // Uncaught TypeError: Cannot convert undefined or null to object // at hasOwnProperty (<anonymous>)

Чтобы убедиться, что параметр правильно передан hasOwnProperty, я установил этот тестовый пример:

var testFilter = (key) => { console.log(key); return true; }; Object.keys(x).filter(testFilter);

a, b и bamboo записываются на консоль, поэтому я знаю, что он правильно передает параметры.

Почему поведение hasOwnProperty не работает правильно?

Лучший ответ:

object.hasOwnProperty принимает объект в качестве своей this значение. Когда вы выполняете прямые вызовы, это неявно обеспечивается путем просмотра того, на какой объект вызывается метод, но с косвенными вызовами вы должны указать this вручную:

var obj = { foo: 3 }; var func = obj.hasOwnProperty; console.log(func(‘foo’)); // TypeError: Cannot convert undefined or null to object

Один из самых простых способов сделать это – function.bind, вот так:

var obj = { foo: 3 }; var func = obj.hasOwnProperty.bind(obj); // bind ‘this’ of function to ‘obj’ console.log(func(‘foo’)); // = trueОтвет №1

Для правильного обратного вызова вам необходимо привязать объект к hasOwnProperty а затем использовать возвращаемую функцию.

var obj = { a: 2, b: 7, bamboo: 22 }, keys = Object.keys(obj).filter({}.hasOwnProperty.bind(obj)); console.log(keys);

Оцените статью
Добавить комментарий