B-Teck!

お仕事からゲームまで幅広く

【JavaScript】JSLintで"The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype."が出た時の対処

なぜ出るのか

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