Javascript 将新值附加到持久对象

Javascript 将新值附加到持久对象,javascript,Javascript,我试图用尼古拉斯·扎卡斯(Nicholas Zakas)的书中描述的持久构造函数方法编写一个链表,但我遇到了一个概念问题 我知道持久构造函数模式是出于安全原因使用的,并且避免使用“this”和“new”。但是,我不确定这是否意味着我无法创建允许将节点附加到链接列表的方法 我发现的所有例子基本上都是直接取自道格拉斯·克罗克福德,没有任何变化。他使用的示例仅从对象检索信息 我的问题是:这个构造函数模式是否允许将数据附加到这样的数据结构中?如果没有,Crockford说我们需要避免“这个”和“新的”,

我试图用尼古拉斯·扎卡斯(Nicholas Zakas)的书中描述的持久构造函数方法编写一个链表,但我遇到了一个概念问题

我知道持久构造函数模式是出于安全原因使用的,并且避免使用“this”和“new”。但是,我不确定这是否意味着我无法创建允许将节点附加到链接列表的方法

我发现的所有例子基本上都是直接取自道格拉斯·克罗克福德,没有任何变化。他使用的示例仅从对象检索信息

我的问题是:这个构造函数模式是否允许将数据附加到这样的数据结构中?如果没有,Crockford说我们需要避免“这个”和“新的”,我有什么选择

编辑(到目前为止的链表代码):


我仍然不太确定耐用物品,但我认为您想要做的可能是:

var LinkedList = function(val) {
  // A private object
  var node = {
    val: val,
    next : null
  };

  // Method
  var getVal = function() {
    return node.val;
  };
  var setVal = function(val) {
    node.val = val;
  };
  var getNext = function() {
    return node.next;
  };
  var setNext = function(newNode) {
    // You have to ensure its a node here
    if (true) {
      node.next = newNode;
    }
  };
  // Append to tail
  var appendVal = function(val) {
    if (node.next === null) {
      node.next = LinkedList(val);
    } else {
      node.next.appendVal(val);
    }
  };
  var appendNode = function(newNode) {
    if (node.next === null) {
      node.next = newNode
    } else {
      node.next.appendNode(newNode);
    }
  };
  var print = function() {
    var str = '' + node.val;
    if (node.next !== null) {
      str += ' => ' + node.next.print();
    }
    return str;
  }

  // Only expose method to user.
  return {
    getVal : getVal,
    setVal : setVal,
    getNext: getNext,
    appendVal: appendVal,
    appendNode: appendNode,
    print: print
  };
};
当我们需要根时,调用
var root=LinkedList(val)
然后该函数将创建一个隐藏对象,设置值,并返回能够为您获取/设置对象值的方法。 您只能对公开的对象执行操作,这样就避免了
this
new
,并获得了无法直接访问的私有对象

你想做的可能是这样写:

var first = LinkedList(25);
var myList = LinkedList(null);
myList.appendNode(first);
var second = LinkedList(33);
myList.appendNode(second);
console.log(myList.print());  // null => 25 => 33

我可以看一下你们的链表代码吗?我没有你提到的那本书。我添加了我目前正在进行的工作。规格大小是用来做什么的?在你的代码中,
that={}
将引用范围外,可能是
window
,因此它等于
window.that={}
,除非您定义了
,即
before.spec.size应该是列表的大小,但我不确定这是否合适。此linkedList的实例化类似于:
var myList=linkedList({root:someNode,size:1})@fuyushimoya很好地抓住了范围问题。哇,这很有趣!我从这段代码中学到了很多关于javascript的知识。您能详细解释一下
appendVal
方法吗?似乎我们正在将一个链表连接到一个新实例化的链表。非常感谢。
appendVal
只是将2个东西组合成1,比如
a.appendVal(2)
在某种程度上等于
var b=LinkList(2);a、 附加节点(b)只是为了方便起见,有时候我们太懒了,不想写两行来做这件事。太好了。非常感谢您的回复。
var first = LinkedList(25);
var myList = LinkedList(null);
myList.appendNode(first);
var second = LinkedList(33);
myList.appendNode(second);
console.log(myList.print());  // null => 25 => 33