2016-09-30 45 views
2

我试图以更优雅的方式使用hasOwnProperty使用hasOwnProperty时无法将null或undefined转换为对象

我这里有这样的代码,它工作正常:

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); 

abbamboo都记录到控制台上,所以我知道它正确传递参数。为什么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);

相关问题