for..in 迴圈及 hasOwnProperty

zhaiduting發表於2020-11-24

for..in 迴圈及 hasOwnProperty

function C() {
    this.p0 = 'this.p0';
}

C.__proto__.p1 = 'C.__proto__.p1';  //鏈屬性沒有被覆蓋
C.p2 = 'C.p2';
C.prototype.p3 = 'C.prototype.p3';  //原型屬性
C.__proto__.p4 = 'C.__proto__.p4';  //鏈屬性被下面的 p4 覆蓋
Object.defineProperty(C, 'p4', {value: 'defineProperty enumerable: undefined'});
Object.defineProperty(C, 'p5', {value: 'defineProperty enumerable: true', enumerable: true});
C.__proto__.p5 = 'C.__proto__.p5';  //鏈屬性被上面的 p5 覆蓋

for (var k in C) {
    console.log('hasOwnProperty:', C.hasOwnProperty(k), '\t', k, '->', C[k]);
}

for in 不能迴圈動態屬性 this.xxx
for in 忽略原型 prototype;
for in 可以迴圈鏈屬性(__proto__.p1);
for in 忽略被覆蓋的鏈屬性(__proto__.p4&5
for in 忽略 enumerable: undefined|null|false|0
總之:忽略動態,忽略原型,忽略被覆蓋的鏈屬性及不可列舉的屬性
或者說:for in 迴圈的是可以列舉的靜態屬性,以及沒被覆蓋的鏈屬性


hasOwnProperty 可以過濾原型鏈
hasOwnProperty 不可以過濾 enumerable 為真的屬性

var c = new C
for (var k in c) {
    console.log('hasOwnProperty:', c.hasOwnProperty(k), '\t', k, '->', c[k]);
}

for..in 不能迴圈建構函式里面的this屬性,但是可以迴圈new出的物件
for..in 忽略原型 prototype,但是對於new出來的物件(省略N個字),尤其注意滑鼠所指的這個值是false不是true

C.prototype.p3 === c.__proto__.p3   // true

因為 for in 不能迴圈原型屬性,所以無法列印 C 的 p3 屬性。
因為 for in 能迴圈沒被覆蓋的鏈屬性,所以能列印 c 的 p3 屬性。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章