Вопрос:
Я пытаюсь использовать 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);