我正在尝试通过添加扩展
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
方法并且可以访问私有字段。
谁能解释一下这里发生了什么?
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));