Javascript 无法理解ECMA6中WeakMap的行为

Javascript 无法理解ECMA6中WeakMap的行为,javascript,ecmascript-6,weakmap,Javascript,Ecmascript 6,Weakmap,在ECMA6中使用WeakMap时,我面临着一个奇怪的场景。我正在写一节课,内容如下 'use strict'; class WeekMaptest { constructor(options){ console.log("constructor"); this.weekMap = new WeakMap(); this._init(options); } _init(options) { console.

在ECMA6中使用WeakMap时,我面临着一个奇怪的场景。我正在写一节课,内容如下

'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
console.log(obj.getName());
输出:罗希特
log(obj.weekMap.get(obj.name));
输出:罗希特
log(obj.weekMap.set(obj.name='I mena');
产出:I中东和北非
控制台日志(对象weekMap);
输出:WeakMap{name:'I mena'}
log(obj.weekMap.get(obj.name));
错误:
/home/bll/blljb/server/lib/ease/testweak.js:35
log(obj.weekMap.get(obj.name));
^
TypeError:无法读取未定义的属性“name”
反对。(/home/bll/bll jb/server/lib/ease/testweak.js:35:33)
在模块处编译(Module.js:434:26)
在Object.Module.\u extensions..js(Module.js:452:10)
在Module.load(Module.js:355:32)
在Function.Module.\u加载(Module.js:310:12)
位于Function.Module.runMain(Module.js:475:10)
启动时(node.js:117:18)
在node.js:951:3

我无法弄清楚WeakMap的这种行为

我猜你把
set
get
搞混了

console.log(obj.weekMap.set(obj).name = 'I mena');
此调用之前的条目:obj=>obj

此调用后的条目:obj=>undefined


set
需要键和值的参数。您不提供值,因此此代码将键为
obj
的条目的值设置为
undefined
。因此,对
obj.weekMap.get(obj)
的下一次调用返回未定义。

BTW:A
weekMap
将是一个日历;)所以问题是在类内使用WeakMap定义的变量实际上不是私有的?@RohitKumarChoudhary我不知道“使用WeakMap定义的变量”是什么意思。@RohitKumarChoudhary如果你指的是
privateProps
,那么这个变量只在
\u init
中可见。但是它持有的引用通过弱映射传递到外部。如果你指的是弱映射,那么这里没有什么是私有的。你对weakMap的解释是正确的,我知道闭包,但我的问题是为什么人们建议使用weakMap?创建私有属性。谢谢你的回答,@RohitKumarChoudhary现在我明白你想要实现什么了。您必须在类之外声明弱映射,并添加“私有”属性,将类的实例作为键,就像您已经做的那样。当对象被“删除”(即不再被引用)时,弱贴图中的条目将自动删除。使用常规映射时,条目将保留,因此无法对实例进行垃圾收集,这实际上会造成内存泄漏。