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

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

先看一段代码:

var Person = 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

var p1 = new Person('fname', 20);
console.log(p1);    //Object { fname="fname",  age=20}
for(var s in p1){
    console.log(s);
    //fname
    //age
}

在这段代码中,先声明了一个构造器,随后使用 Object.defineProperty 方法来定义了 Person 类的 fname 属性的 value 和 enumerable。
随后我们打印了 Person.fname 可以看出代码是运行并生效,但是在随后新声明的变量中它仍然可以被 for in 循环输出。

于是,我尝试了使用字面量定义变量,这回正常了, 请问这是声明原因引起的呢?

var Person = {fname:'fname', age:20};
Object.defineProperty(Person, 'fname', {
    value:'change',
    enumerable:false    
});
console.log(Person.fname);    //change

console.group('遍历Person的可枚举属性');
for(var s in Person){
    console.log(s);        //age
}
console.groupEnd();

其实你写的基本上没错,只不过你忘了 原型(prototype)

Object.defineProperty(Person.prototype, 'fname', {
    value: 'change',
    enumerable: false
});

因为Object.defineProperty如名字显示只对Object本身生效。第一个的Person方法被执行之后生成的是一个新的实例并不是方法本身。自然不会有之前的define.而这时候如果进行Person.fname = 'xxx'的赋值,你会发现define实际已经生效了。

function之中的this关键词是指代生成的实例本身而并不是方法本身的值。

【热门文章】
【热门文章】