关于对象的可枚举属性[[enumerable]]

先看一段代码:
varPerson=function(fname,age){
this.fname=fname;
this.age=age;
};
//Object内部有一个name属性,如果这里使用defineProperty的话会覆盖该name属性
Object.defineProperty(Person,'fname',{
value:'change',
enumerable:false
});
console.log(Person.fname);//change
console.log(Person.age);//undefined
varp1=newPerson('fname',20);
console.log(p1);//Object{fname="fname",age=20}
for(varsinp1){
console.log(s);
//fname
//age
}
在这段代码中,先声明了一个构造器,随后使用Object.defineProperty方法来定义了Person类的fname属性的value和enumerable。随后我们打印了Person.fname可以看出代码是运行并生效,但是在随后新声明的变量中它仍然可以被forin循环输出。
于是,我尝试了使用字面量定义变量,这回正常了,请问这是声明原因引起的呢?
varPerson={fname:'fname',age:20};
Object.defineProperty(Person,'fname',{
value:'change',
enumerable:false
});
console.log(Person.fname);//change
console.group('遍历Person的可枚举属性');
for(varsinPerson){
console.log(s);//age
}
console.groupEnd();
慕容森
浏览 676回答 2
2回答

长风秋雁

其实你写的基本上没错,只不过你忘了原型(prototype)Object.defineProperty(Person.prototype,'fname',{value:'change',enumerable:false});

绝地无双

因为Object.defineProperty如名字显示只对Object本身生效。第一个的Person方法被执行之后生成的是一个新的实例并不是方法本身。自然不会有之前的define.而这时候如果进行Person.fname='xxx'的赋值,你会发现define实际已经生效了。function之中的this关键词是指代生成的实例本身而并不是方法本身的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript