プロパティをオーバライドした時のfor-inの挙動について
- 評価
- クリップ 2
- VIEW 626

退会済みユーザー
function Hoge(){}
Hoge.prototype.a = 'a';
var obj = new Hoge();
Object.defineProperty(obj, 'a', {value: 1});
for(var prop in obj){
console.log(prop)
}
プロパティaをObject.definePropertyでenumerable:falseでオーバーライドしものを
for-inで回すと、IEとchrome(firefox)で動作が異なります。
- IE :'a'が表示される。
- chrome(firefox):何も表示されない
これはIEのバグでしょうか?
(環境はwindows7-IE11です)
上記コードはこちらのcodepenで確認できます。
https://codepen.io/anon/pen/rpqdRW?editors=1111
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
試してみましたが、おそらく解釈の違いによるものでしょう
prototypeで設定したプロパティは普通に参照できますが
上書きした時にIEはenumerableな状態になりそれ以外はenumerableではない状態
となるようです。
function Hoge(){this.c='c1';}
Hoge.prototype.a='a1';
var obj1 = new Hoge();
Object.defineProperty(obj1, 'b', {value: 'b1'});
for(var i in obj1){
console.log("obj1:"+i+":"+obj1[i]);
}
var obj2 = new Hoge();
Object.defineProperty(obj2, 'a', {value: 'a2'});
Object.defineProperty(obj2, 'b', {value: 'b2'});
Object.defineProperty(obj2, 'c', {value: 'c2'});
for(var i in obj2){
console.log("obj2:"+i+":"+obj2[i]);
}
var obj3 = new Hoge();
Object.defineProperty(obj3, 'a', {enumerable: true});
Object.defineProperty(obj3, 'b', {enumerable: true});
Object.defineProperty(obj3, 'c', {enumerable: true});
for(var i in obj3){
console.log("obj3:"+i+":"+obj3[i]);
}
var obj4 = new Hoge();
Object.defineProperty(obj4, 'a', {value: 'a4',enumerable: true});
Object.defineProperty(obj4, 'b', {value: 'b4',enumerable: true});
Object.defineProperty(obj4, 'c', {value: 'c4',enumerable: true});
for(var i in obj4){
console.log("obj4:"+i+":"+obj4[i]);
}
※一部サンプルの詳細を追記
仕様上どちらかが間違っている(バグ)可能性もありますし
どちらでも解釈上問題ないような気もします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/01/18 21:10
色々検証した結果propertyIsEnumerableの結果がfalseになるのでIEのバグの方が高そうでした。
ひとまず。propertyIsEnumerableでfalseの場合、無視するようにして解決できました。