11088

[code]

    hasOwnProperty.call(A, B)
    
[/code]

・どういう意味でしょうか？  
・下記と同じ？？

[code]

    A.hasOwnProperty(B)
    
[/code]

* * *

hasOwnProperty上書きの件で、質問追記します。

・for文と組合せた下記のような記述をよく見かけるのですが、

[code]

    for (var key in obj ) {
        if ( obj.hasOwnProperty(key) ) {
             console.log(key + ":" + obj[key]);
        }
    }
    
[/code]

・「当初質問した内容の両者」が同じなら、Function.prototype.call()を使用した方が良いのではないかと思うのですが…

[code]

    for (var key in obj ) {
        if ( hasOwnProperty.call(obj, key) ) {
             console.log(key + ":" + obj[key]);
        }
    }
    
[/code]

・Function.prototype.call()をあまり見かけないのは、hasOwnPropertyが上書きされることなどない、という前提に立っているからでしょうか？  
・そこまで考慮する必要はないってこと？


CC BY-SA 3.0
2015-06-08T00:12:09.087
11085
2015-06-10T02:10:40.967
2015-06-09T01:27:24.820
7886
7886
question
javascript
hasOwnProperty.call(A, B) と A.hasOwnProperty(B)


はい、基本的には同じです。

ただし、`A.hasOwnProperty = null;` 等とメソッドが上書きされていた場合、前者は正常に動作し、後者はランタイム エラーになります。

* * *

オブジェクトが持つキーを自分でコントロールできるのであれば、`.call()`は使わなくて良いでしょう。できない場合 (例えばユーザー入力をキーにする)
は、そのプロパティを信用できないので `.call()` 呼び出しのほうが良いです。この場合、他にも考慮すべきことがあって、例えば `__proto__`
が上書きされるとプロトタイプチェーンが変化して予期せぬ挙動の原因になる可能性があります。

なお、性能的には `.call()` 呼び出しのほうが若干悪いです。


CC BY-SA 3.0
2015-06-08T01:55:33.680
11088
2015-06-10T02:10:40.967
2015-06-10T02:10:40.967
4809
4809
11085
answer