Object.defineProperty在构造函数中不做任何事情
Object.defineProperty does nothing in constructor
我最近重组了我的three.js项目,我开始遇到一个问题,每个对象似乎都用完全相同的几何形状和材料渲染。我在调试器中跟踪这个问题到这个构造函数:
function Geometry() {
Object.defineProperty( this, 'id', { value: GeometryIdCount() } );
this.uuid = exports.Math.generateUUID();
...
Chrome显示没有属性的this
对象之后的Object.defineProperty
,和id
回到undefined
当事情试图使用它以后。然而,当我使用three.js调试旧项目时,id
在调用后的调试器中定义在this
上。
什么会导致Object.defineProperty
什么都不做?最有可能的罪魁祸首是我已经从使用Javascript中的node.js require
调用切换到使用TS编译器从Typescript中包含三个到ES6 import
调用,但我不清楚为什么这会对这个构造函数产生这种影响。
只是说"id
作为未定义返回"并不一定意味着Object.defineProperty
没有做任何事情,尽管我确实理解您在Object.defineProperty
调用后直接查看了this
的属性,我无法解释。如果GeometryIdCount()
返回undefined,那么这就解释了为什么后面的值是undefined
。在构造函数完成之后,您是否验证了属性本身是未定义的,而不是属性值?
这可能就像使用"use"而不是"use",或者Typescript、ES6或three.js需要它,但为什么不这样写呢:
this.id = GeometryIdCount();
如果函数返回undefined,则仍然会将unknown赋值给this.id
。
更新:你的问题让我研究了Object.defineProperty到底是做什么的,结果令人惊讶,而且信息量很大。当我使用WebGL时,我没有使用three.js,所以我错误地认为Geometry是您编写的函数。
当你以你描述的方式调用Object. defineproperty时,(将第三个参数设置为只有"value"属性的Object)它将所有Object属性都具有的可写、可配置和可枚举属性设置为false。另一方面,语句this.id = GeometryIdCount()
将这3个属性设置为true。js的作者显然想给每个几何对象分配一个唯一的键,这样用户就不能改变它的值。我没有寻找其他原因。
我建议你做一个项目的副本,删去任何你想保密的东西,(如果你想在这里发布的话),尽可能地摆脱那些分散注意力的代码,这样更容易确定是什么导致了问题。你知道,当你不能再复制id属性未创建或未定义的不良行为时,停止删除代码。我做了一个小程序,并试图猜测如何再现这个问题,在调用var g = Geometry(...)
之前做不好的事情,如Geometry.prototype.id = undefined
,(没有新的关键字),但无法再现这个问题。我没有尝试覆盖GeometryIdCount
的行为,也没有阻止id
属性的创建。这看起来像是故意破坏,我怀疑你会怀疑你的情况。
- 如何按id查找两个类中任一类的子元素
- HackReactor,编码窗口现在可以访问一个名为“”的对象;招生;使用名为“;showApp”;.调用此方法时不带任
- 是否有任何用Javascript编写的开源JSDoc解析器
- 禁用负责任设计中的元素
- 在 JavaScript 中使用正则表达式在单词的任一侧添加空格
- 祖尔布基金会 使用 12 列布局的任一侧的空间
- 任何在Phonegap中跟踪主页按钮按下事件的可能性
- 任何在javascript中捕获上下文菜单“粘贴”的方法
- 如何使用任一类jquery搜索父级
- javascript预加载任何在chrome中不起作用的图像
- toFixed是'Don’不要做任何事
- 用JS转换任何以hashtag开头的东西.但前提是超过3个字符
- Gradle exec任务在用Karma运行javascript单元测试时挂起
- 任何在Android中与WebView通信的方式
- 任何以0开头的号码都被认为是电话号码
- 如何在不支持HTML5或flash的任天堂3ds浏览器中播放视频
- SASS任务在gulp with sourccomments: 'map'生成'断言失败'
- 在发射下键时禁用任天堂3DS滚动功能
- 在Backbone中,model.get('foo')和model.attributes.foo之间的任
- Fine uploader Async任务在Chrome中工作,但在IE11中不工作