将新值附加到持久对象

时间:2015-06-27 13:33:36

标签: javascript

我正在尝试使用Nicholas Zakas的书中描述的持久构造函数方法编写链接列表,但我遇到了一个概念问题。

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

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

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

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

var linkedList = function (spec) {
    var that = {};

    that.addNode = function (newNode) {
        if (spec.size && spec.root) {
            // not sure
        } else {
            // not sure yet
        }
    };

    that.getRoot = function () {
        return spec.root; // for an idea of how to retrieve
    };

    return that;
};

// how I'd like to use the list
var firstNode = node({val: 25, next: null});
var myList = linkedList({root: firstNode, size: 1});
var secondNode = node({val: 33, next: null});
myList.add(secondNode); // I feel this isn't possible

1 个答案:

答案 0 :(得分:0)

我仍然不太确定耐用物品,但我认为你想做的可能就是这样:

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);然后该函数将创建一个隐藏对象,设置该值,并返回能够为您获取/设置对象值的方法。 您只能使用公开的对象执行操作,这样就避免了thisnew,并且您获得了无法直接访问的私有对象。

你想做的事情可能是这样写的:

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