【问题标题】:hide the getter or add in the proto Object隐藏 getter 或在 proto 对象中添加
【发布时间】:2018-02-20 18:23:40
【问题描述】:

是一种我可以创建吸气剂的方法,但将其隐藏或添加到 proto 中? 这里的例子,我使用简单的 OBJ。 看get sprite()

    buttonsData[name] = {
        name:name,
        type:bType,
        slot:slot,
        get sprite() { return this.slot.currentSprite },
    };

但是我发现它非常污染,我该如何隐藏它或写它以便它不会在调试终端中打扰我的眼睛? 我想隐藏 get sprite() { return this.slot.currentSprite }

【问题讨论】:

  • so that it does not disturb my eyes in a debug terminal? ... 也许使用其他 IDE 或某事?
  • 呃,不想看就不要看Object.prototype(不要在你的视野中展开)?!
  • 好的抱歉图片不清楚,它的“get sprite() { return this.slot.currentSprite }”我需要隐藏
  • 想要将一些功能移到原型链上的原因有很多,但“这样它不会在调试终端中打扰我的眼睛”不是其中之一。跨度>
  • 我尽量保持干净,因为有时我会浪费很多时间来可视化属性或方法。尤其是几周后我必须回来的时候。我 100% 同意你的观点,但问题是我无法在这个版本的 node.js 上安装主题

标签: javascript debugging object getter-setter


【解决方案1】:

您可以使用Object.create() 嵌入匿名prototype,但请注意,这略微恶化 drastically improves 性能除了“它在调试终端中打扰我的眼睛”之外没有其他原因。

我不提倡在性能关键的代码中使用这种方法 How...

buttonsData[name] = Object.assign(Object.create({
    get sprite() { return this.slot.currentSprite }
}), {
    name: name,
    type: bType,
    slot: slot
});

这会创建一个像这样的对象:

{
  name: "Spines",
  slot: Slot,
  type: "sheetsType",
  __proto__: {
    get sprite: function () {...},
    __proto__: Object
  }
}

为了可重用性,最好实现class,而不是为添加到buttonsData 的每个对象创建匿名prototype

class ButtonsData {
  constructor (data = {}) {
    Object.assign(this, data)
  }

  get sprite () { return this.slot.currentSprite }
}

并像这样使用它:

buttonsData[name] = new ButtonsData({ name, type: bType, slot })

【讨论】:

  • 这些对象是在加载阶段创建的,不会影响性能。
  • @jon 每次访问 buttonsData[name].sprite 时,属性访问的评估速度会变慢,因为访问器存在于 prototype 链的更高位置,因此搜索需要更长的时间。是的,性能有所下降。
  • 是的,我明白了,谢谢,但是它是一个简单的外部模块,一个地图编辑器。我有很多性能游戏,因为大多数大型计算都是由 GPU 完成的。我可以在某个地方作弊。
  • @jon 我不得不道歉,但显然这种方法的速度提高了 14 倍。我还在摸不着头脑。
  • @jon 我写了a question 关于它。有人挖了this,这表明这是由于 V8 中的 getter 和 setter 的实现问题。在 Firefox 等其他引擎中,两者之间没有性能差异。
【解决方案2】:

您在那里看到的那些__defineGetter____defineSetter____lookupGetter____lookupSetter__ 属性与您的sprite getter 无关。它们只是 Object.prototype 的本机(但长期弃用)方法(这是您在视图中扩展的对象)。你对他们无能为力。

【讨论】:

  • 好吧抱歉图片不清楚,它的“get sprite() { return this.slot.currentSprite }”我需要隐藏
  • 我认为你做不到。您可能想尝试Object.defineProperty(…, "sprite", { enumerable: false }),但我不确定这将如何影响控制台视图。
  • 非常感谢您的帮助,但@Patrick Roberts 给了我正确的方法。
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 2016-10-03
  • 1970-01-01
  • 2020-09-03
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多