Object.defineProperty在构造函数中不做任何事情

Object.defineProperty does nothing in constructor

本文关键字:任何事 defineProperty 构造函数 Object      更新时间:2023-09-26

我最近重组了我的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属性的创建。这看起来像是故意破坏,我怀疑你会怀疑你的情况。