在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源码贴在以下:
<script type="text/javascript"> function Person(){} var per = new Person; Object.defineProperties(per, { "nickName": { value:"Tom", writable:true }, "age": { value:20, configurable:false, writable:false } }); var o = Object.getOwnPropertyDescriptor(per,"nickName"); alert(JSON.stringify(o)); </script>
Google中执行结果:
这个结果是正确的。可是。改一个地方。结果就不同了
<script type="text/javascript"> function Person(){} var per = new Person; Object.defineProperties(per, { "nickName": { value:"Tom", writable:true }, "age": { value:20, configurable:false, writable:false } }); var name = Object.getOwnPropertyDescriptor(per,"nickName"); alert(JSON.stringify(name)); </script>
执行结果:
这是为什么呢?就仅仅是改了一个简单的变量名啊
问题出在了name身上,可是本人出入JS,不懂,在网上找了资料也没有结果,后面就去请教了一个师兄。也把问题放在了论坛上:http://bbs.csdn.net/topics/390799744?
page=1#post-397474060,
name是window属性。作用是设置或返回窗体的名字,数据类型是字符串。
由于第一句是function Person(){}。已经结束了。所以以下的代码可能在全局context中,也就是说你以为alert(JSON.stringify(name));是输出的上面的var name,但实际上可能输出的是window.name。至于输出[Object object],这个类型是name的值的类型。