3

我正在尝试以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);

ab并且bamboo都记录到控制台,所以我知道它正确地传递了参数。

为什么该行为不能正常工作hasOwnProperty

4

2 回答 2

3

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

于 2016-09-30T08:53:35.693 回答
2

对于正确的回调,您需要将对象绑定hasOwnProperty然后使用返回的函数。

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

console.log(keys);

于 2016-09-30T08:53:15.520 回答