2016-09-30 1 views
2

hasOwnPropertyをより洗練された方法で使用しようとしています。hasOwnPropertyを使用している場合、nullまたは未定義のオブジェクトをオブジェクトに変換できません

私は正常に動作し、ここで、このコードを、持っている:

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

関連する問題