在不使用实例ID Javascript的情况下创建私有成员

在不使用实例ID Javascript的情况下创建私有成员,javascript,Javascript,我有一个LinkedList类,我想将实例的头成员设为私有。我了解了如何为每个实例创建密钥id,这些实例隐藏LinkedList类的用户成员。正在寻找其他方法使这个.head成为私有 函数链接列表(){ this.head=null; }; LinkedList.prototype=(函数(){ 功能反转所有(当前,上一个){ 如果(!current.next){//我们有头了 这个头=电流; this.head.next=prev; } var next=当前。next; current.n

我有一个LinkedList类,我想将实例的
成员设为私有。我了解了如何为每个实例创建密钥id,这些实例隐藏LinkedList类的用户成员。正在寻找其他方法使
这个.head成为私有

函数链接列表(){
this.head=null;
};
LinkedList.prototype=(函数(){
功能反转所有(当前,上一个){
如果(!current.next){//我们有头了
这个头=电流;
this.head.next=prev;
}
var next=当前。next;
current.next=prev;
反向(下一个,当前);
};
返回{
构造函数:LinkedList,
反向:函数(){
reverseAll(this.head,null);
},
总目:职能(){
把这个还给我;
}
}
})();
LinkedList.prototype.add=函数(值){
变量节点={
价值:价值,
下一个:空
};
无功电流;
if(this.head==null){
this.head=节点;
}否则{
电流=这个头;
while(当前.下一个){
当前=当前。下一步;
}
current.next=节点;
}
返回节点;
}
LinkedList.prototype.remove=函数(节点){
无功电流,值=node.value;
如果(this.head!==null){
if(this.head==节点){
this.head=this.head.next;
node.next=null;
返回值;
}
//如果节点不是头部,则查找节点
电流=这个头;
while(当前.下一个){
if(current.next==节点){
current.next=node.next;
返回值;
}
当前=当前。下一步;
}
}
}

$(函数(){
var obj=新链接列表();

对于(var i=1;i我能想到的唯一方法是像这样的某种令人憎恶的东西:

function LinkedList() {
    let head = null; 
    // Instead of using a prototype, you attach the methods directly to this.
    // This makes the methods unique per instance, so you can attach privately
    // scoped variables (like head).
    this.reverse = function() { 
        // You may use head here.
    };
    this.head = function() { ... };
}
但是,这是非常低效的,因为每次调用都会创建一组全新的闭包


甚至像模块模式(或显示模块模式)这样的解决方案遇到此问题。如果您没有创建太多此对象,上面的示例可能适合您。

使用let意味着我无法访问原型中的head,对吗?是的。您放弃了为此创建原型的能力。此外,它不是
let
所独有的,我可以在那里使用
var
以获得相同的效果。只是这样
let
是ES6中初始化变量的推荐*方法。这些变量未附加到原型中。它们是由构造函数初始化的对象的方法。