Не в состоянии понять поведение WeakMap в ECMA6
Я столкнулся со странным сценарием во время игры с WeakMap в ECMA6. Я пишу класс, который выглядит следующим образом
'use strict';
class WeekMaptest {
constructor(options){
console.log("constructor");
this.weekMap = new WeakMap();
this._init(options);
}
_init(options) {
console.log("init called");
var privateProps = {
name: options.name,
email: options.email
};
this.weekMap.set(this, privateProps);
}
getName(){
return this.weekMap.get(this).name;
}
}
Теперь вызывая этот класс для создания объекта
var obj = new WeekMaptest({name: 'Rohit', email: 'rohit.choudhar@gmail.com'});
А вот и выход
console.log(obj.getName());
Output : Rohit
console.log(obj.weekMap.get(obj).name);
Output : Rohit
console.log(obj.weekMap.set(obj).name = 'I mena');
Output : I mena
console.log(obj.weekMap);
Output: WeakMap { name: 'I mena' }
console.log(obj.weekMap.get(obj).name);
Error:
/home/bll/bll-jb/server/lib/ease/testweak.js:35
console.log(obj.weekMap.get(obj).name);
^
TypeError: Cannot read property 'name' of undefined
at Object.<anonymous> (/home/bll/bll-jb/server/lib/ease/testweak.js:35:33)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:475:10)
at startup (node.js:117:18)
at node.js:951:3
Я не могу разобраться в этом поведении WeakMap.
1 ответ
Решение
Я думаю, ты запутался set
а также get
,
console.log(obj.weekMap.set(obj).name = 'I mena');
Записи перед этим вызовом: obj => obj
Записи после этого вызова: obj => undefined
set
ожидает аргументы для ключа и значения. Вы не предоставляете значение, поэтому этот код устанавливает значение записи с ключом obj
в undefined
, Следовательно, следующий звонок obj.weekMap.get(obj)
возвращает неопределенное.