javascript - 关于对象的可枚举属性[[enumerable]]
黄舟
黄舟 2017-04-10 15:42:08
[JavaScript讨论组]

先看一段代码:

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();
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
阿神

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号