先看一段代码: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});
绝地无双
TA贡献1946条经验 获得超4个赞
因为Object.defineProperty如名字显示只对Object本身生效。第一个的Person方法被执行之后生成的是一个新的实例并不是方法本身。自然不会有之前的define.而这时候如果进行Person.fname='xxx'的赋值,你会发现define实际已经生效了。function之中的this关键词是指代生成的实例本身而并不是方法本身的值。
添加回答
举报
0/150
提交
取消