なぜ出るのか
- for-inステートメントはオブジェクトのプロパティを”全て"列挙する
for (variable in object) { ... }
- その為、対象のオブジェクトのプロパティだけではなく、prototypeから継承した(prototype汚染された)プロパティも列挙される
function A() {} A.prototype.say = 'ファミチキください'; var b = new A(); b.think = '(ファミチキください)'; for (prop in b) { console.log("プロパティ名1:" + prop + "\n"); console.log("値1:" + b[prop] + "\n"); } //出力結果 //プロパティ名1:think //値1:(ファミチキください) //プロパティ名1:say //値1:ファミチキください
対処 hasOwnPropertyを使う
obj.hasOwnProperty(prop)
- obj : オブジェクト
- prop : 調べるプロパティ名
function A() {} A.prototype.say = 'ファミチキください'; var b = new A(); b.think = '(ファミチキください)'; for(prop in b){ if (b.hasOwnProperty(prop)) { console.log("プロパティ名2:" + prop + "\n"); console.log("値2:" + b[prop] + "\n"); } } //出力結果 //プロパティ名2:think //値2:(ファミチキください)
参考
JSLintオプション考察「unfiltered for in」|もっこりJavaScript|ANALOGIC(アナロジック)
Object.prototype.hasOwnProperty() - JavaScript | MDN
JavaScript - Prototype汚染に負けないfor in文の書き方 - Qiita