2016-09-30 6 views
2

Я пытаюсь использовать hasOwnProperty более элегантным способом.Невозможно преобразовать null или undefined в объект при использовании 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?

+4

btw, ключи всегда возвращают свойства, которые являются собственными свойствами объекта. –

ответ

2

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

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

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

 
console.log(keys);