for..in 循环及 hasOwnProperty

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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
63
粉丝
17
喜欢
140
收藏
118
排名:132
访问:7.4 万
私信
所有博文
社区赞助商