【问题标题】:An object modified with Object.defineProperty does not cause a TypeError使用 Object.defineProperty 修改的对象不会导致 TypeError
【发布时间】:2023-01-07 14:28:39
【问题描述】:

我正在创建一个更改指纹的实用程序。使用 Object.defineProperty 更改的值不会导致 TypeError,就像我引用原始对象时那样。由于此功能,安全系统了解我正在更改值。

我改变值如下(屏幕只是一个例子,我改变了很多值,所以我需要一个通用的解决方案来解决所有这些问题)

const proto = Screen.prototype;
const propName = 'availHeight';
const descriptors = Object.getOwnPropertyDescriptor(Screen.prototype, 'availHeight');
const overrideDescriptors = {
    get: () => 1000
}
Object.defineProperty(proto, propName, {
    ...descriptors,
    ...overrideDescriptors
});

应该是:

typeof Screen.prototype.availHeight; VM88:1 Uncaught TypeError: Illegal invocation at <anonymous>:1:25

当值改变时会发生什么:

typeof Screen.prototype.availHeight; 'number'

我该如何解决这个问题,以便这个检查与原始值一样导致 TypeError?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    一种可能对您有用的方法是调用原始的 getter(如果它最初确实会抛出),但忽略结果值并返回您自己的值。

    因为您正在设置一个吸气剂,所以您可能不应该传播现有的描述符(如果它是数据描述符就会发生冲突)。如果您还想复制可枚举性,请显式提取它。

    class Screen {
      get availHeight() {
        throw new Error('Bad!');
      }
    }
    const proto = Screen.prototype;
    const propName = 'availHeight';
    const originalDescriptor = Object.getOwnPropertyDescriptor(Screen.prototype, 'availHeight');
    const overrideDescriptor = {
      get() {
        if (originalDescriptor.get) {
          // Call the original getter, if there was one, and possibly throw
          originalDescriptor.get.call(this);
        }
        return 1000;
      },
      enumerable: originalDescriptor.enumerable
    };
    Object.defineProperty(proto, propName, overrideDescriptor);
    const s = new Screen();
    s.availHeight;

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2022-01-07
      • 2018-06-21
      • 2022-07-05
      • 2013-06-14
      相关资源
      最近更新 更多