前端复习--对象的可枚举属性

初学时,并不是很注意这些细节的东西,但是程序员写代码的时候,怎么会容忍胡而麻三的记忆.

1 for in 语句的复习--问题引出

var triangle = {a:1, b:2, c:3};

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

var obj = new ColoredTriangle();

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("o." + prop + " = " + obj[prop]);
  } 
}

// Output:
// "o.color = red"

for in 会顺着原型链,把可枚举属性都枚举出来; 如果只想枚举自己的属性,可以像上述例子使用hasOwnProperty来过滤.

2 以上代码相当于调用Object.keys(obj);

Object.keys() 方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。


3 那我就要问了,什么是对象的可枚举属性

for...in 循环只遍历可枚举属性。像 Array 和 Object 使用内置构造函数所创建的对象都会继承自 Object.prototype 和 String.prototype 的不可枚举属性,例如 String 的 indexOf()  方法或者 Object 的 toString 方法。


4 最新一次看看到这个问题,这里需要补充一下:

一个属性是否可枚举也跟从哪个对象的角度看有关:

对于一个对象来说,任何来自原型链上的属性都是不可枚举的: obj.propertyIsEnumerable('a')  //false

而如果propertyIsEnumerable的调用时来自原型链上的某个对象,那么这个属性就是可枚举的: obj.constructor.prototype.propertyIsEnumerable('a') //true   那为什么在for in 的时候,这些属性都能看到呢?可以推断,当顺着原型链找到这些变量的时候,就是从原型对象上看这些属性为可枚举的!!!????

不可枚举属性 都有哪些?

对象属性可枚举,表示该属性的值不可修改,可认为该属性是常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值