无法从同一个类中访问私有字段

问题描述 投票:0回答:1

我正在尝试通过添加扩展

Map
超类的
TypedMap
子类来增强 JavaScript 中的
Map
类。

TypeMap.js

export default class TypedMap extends Map {
  #keyType;
  #valueType;
  constructor(keyType, valueType, entries) {
    if (entries) {
      for (let [k, v] of entries) {
        if (typeof k !== keyType || typeof v !== valueType) {
          throw new TypeError(`Wrong type for entry [${k}, ${v}]`);
        }
      }
    }

    super(entries);

    this.#keyType = keyType;
    this.#valueType = valueType;
  }

  set(key, value) {
    if (this.#keyType && typeof key !== this.#keyType) {
      throw new TypeError(`${key} is not of type ${this.#keyType}`);
    }

    if (this.#valueType && typeof value !== this.#valueType) {
      throw new TypeError(`${value} is not of type ${this.#valueType}`);
    }

    return super.set(key, value);
  }
}

main.js

import TypedMap from './TypedMap.js';

let entries = [
  [1, 2],
  [3, 4],
  [5, 6],
];

let typedMap = new TypedMap('number', 'number', entries);

我遇到错误

Uncaught TypeError: Cannot read private member #keyType from an object whose class did not declare it
    at TypedMap.set (TypedMap.js?t=1696367023223:20:14)
    at new Map (<anonymous>)
    at new TypedMap (TypedMap.js?t=1696367023223:13:5)
    at main.js?t=1696367092683:9:16

#keyType
#valueType
字段是私有的,但我仍然应该从类中访问它们
TypedMap
但不知何故,这里的情况并非如此。

我认为这与重写的

set
方法有关,因为我在
test
类中添加了
TypedMap
方法并且可以访问私有字段。

谁能解释一下这里发生了什么?

javascript ecmascript-6 es6-class
1个回答
0
投票

class TypedMap extends Map {
  #keyType;
  #valueType;
  constructor(keyType, valueType, entries) {
    if (entries) {
      for (let [k, v] of entries) {
        if (typeof k !== keyType || typeof v !== valueType) {
          throw new TypeError(`Wrong type for entry [${k}, ${v}]`);
        }
      }
    }

    super();
    this.#keyType = keyType;
    this.#valueType = valueType;
    entries.forEach(entry => this.set(...entry));

  }

  set(key, value) {
  
    if (this.#keyType && typeof key !== this.#keyType) {
      throw new TypeError(`${key} is not of type ${this.#keyType}`);
    }

    if (this.#valueType && typeof value !== this.#valueType) {
      throw new TypeError(`${value} is not of type ${this.#valueType}`);
    }
    
    return super.set(key, value);

  }
}
let entries = [
  [1, 2],
  [3, 4],
  [5, 6],
];

let typedMap = new TypedMap('number', 'number', entries);

console.log([...typedMap.entries()].map(JSON.stringify));

© www.soinside.com 2019 - 2024. All rights reserved.