Object.defineProperty在构造函数中不执行任何操作

时间:2016-10-07 03:32:26

标签: javascript typescript three.js

我最近重组了我的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调用,但它不是向我明白为什么会对这个构造函数产生这种影响。

1 个答案:

答案 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属性。这似乎是故意的破坏,我怀疑你怀疑在你的情况下。