我们使用Object构造函数创造一个对象,它会继承Object.prototype的属性,但我们遍历整个对象的时候并不会输出继承的属性。
var obj = new Object();
obj.name = "terry";
obj.age = 12;
for(var k in obj){
console.log(k,obj[k]);
}
console.log(obj)
console.log(obj.constructor)
执行上面代码,发现对象obj具有__proto__,并且可以访问其中的属性(obj.constructor),但在遍历的时候并没有出现。
那是因为你通过自己添加的属性默认是可迭代的。而__proto__中的属性是不可迭代的。
其实我们自己在定义属性的时候可以将它设置为不可迭代的,将它隐藏起来。
var obj = new Object();
obj.name = "terry"; // 默认就是可以迭代的
Object.defineProperty(obj,"age",{
configurable:true, // 是否可配置
enumerable:false, // 是否可迭代
writable:false, // 是否可写
value:"12" // 默认值
})
通过Object.defineProperty()设置属性后可以将该属性设置为不可迭代,主要遍历的时候就不会输出了。还可以设置是否可写,如果设置为false,那么属性值就不会被改变。