我正在尝试使用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
答案 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);
然后该函数将创建一个隐藏对象,设置该值,并返回能够为您获取/设置对象值的方法。
您只能使用公开的对象执行操作,这样就避免了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