我最近重组了我的three.js项目,我开始遇到一个问题,即每个对象似乎都使用完全相同的几何和材质进行渲染。我在调试器中跟踪了这个构造函数的问题:
function Geometry() {
Object.defineProperty( this, 'id', { value: GeometryIdCount() } );
this.uuid = exports.Math.generateUUID();
...
Chrome在this
之后的Object.defineProperty
对象上没有显示任何属性,而id
在{I-}}稍后会再次使用时显示undefined
。但是,当我调试使用three.js的旧项目时,id
在调用后的this
中定义。
什么可能导致Object.defineProperty
什么都不做?最可能的罪魁祸首是我已经从使用来自Javascript的node.js require
调用切换到使用TS编译器从Typescript中调用三个ES6 import
调用,但它不是向我明白为什么会对这个构造函数产生这种影响。
答案 0 :(得分:1)
只是说" id
回复为未定义"并不一定意味着Object.defineProperty
什么也没做,虽然我确实理解你在this
电话后直接查看Object.defineProperty
的属性,但我无法解释那。如果GeometryIdCount()
返回undefined,那么这将解释为什么值稍后为undefined
。在构造函数完成后,您是否验证了属性本身是未定义的,而不是属性值?
这可能就像使用"使用"而不是"使用",或者也许是Typescript,ES6或者three.js需要它,但为什么不代替你写:
this.id = GeometryIdCount();
但是,如果函数返回undefined,那么仍将this.id
指定为未知。
<强>更新强> 你的问题让我研究exactly what Object.defineProperty does,这是令人惊讶和非常丰富的信息。当我使用WebGL时,我没有使用three.js,所以我错误地认为Geometry是你编写的函数。
当您以您描述的方式调用Object.defineProperty时,(将第3个参数设置为仅包含&#34;值&#34;属性的Object),它设置可写,可配置和可枚举的属性,其中所有对象属性有,为假。另一方面,语句this.id = GeometryIdCount()
将这3个属性设置为true。 three.js的作者显然想为每个Geometry对象分配一个唯一的键,并使其无法改变其值。我没有寻找其他原因。
我建议您复制一个项目并删除任何您想保密的内容(如果您想在此处发布)并尽可能多地删除令人分心的代码,以便更容易确定导致问题的原因。您知道,当您无法再创建未创建id属性或未定义id属性的错误行为时,请停止删除代码。我做了一个小程序,试着猜测如何重新调试问题,在调用var Geometry.prototype.id = undefined
之前做了g = Geometry(...)
之类的错误,(没有new关键字)但是无法重现问题。我没有尝试覆盖GeometryIdCount
的行为,或阻止创建id
属性。这似乎是故意的破坏,我怀疑你怀疑在你的情况下。