为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2019-04-13 08:37:24
先看一段代码: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);//changeconsole.log(Person.age);//undefinedvarp1=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);//changeconsole.group('遍历Person的可枚举属性');for(varsinPerson){console.log(s);//age}console.groupEnd();
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

其实你写的基本上没错,只不过你忘了原型(prototype)
Object.defineProperty(Person.prototype,'fname',{
value:'change',
enumerable:false
});
                            
查看完整回答
反对 回复 2019-04-13
?
绝地无双

TA贡献1946条经验 获得超4个赞

因为Object.defineProperty如名字显示只对Object本身生效。第一个的Person方法被执行之后生成的是一个新的实例并不是方法本身。自然不会有之前的define.而这时候如果进行Person.fname='xxx'的赋值,你会发现define实际已经生效了。
function之中的this关键词是指代生成的实例本身而并不是方法本身的值。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 675 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信