初学时,并不是很注意这些细节的东西,但是程序员写代码的时候,怎么会容忍胡而麻三的记忆.
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 的时候,这些属性都能看到呢?可以推断,当顺着原型链找到这些变量的时候,就是从原型对象上看这些属性为可枚举的!!!????
不可枚举属性 都有哪些?
对象属性可枚举,表示该属性的值不可修改,可认为该属性是常量。