0

我正在学习如何进入 JS(但对编程并不陌生)。所以,我试图实现一个 LinkedList 只是为了玩 JS。

它工作正常,除了count总是返回NaN。我用谷歌搜索过,并认为原因是我最初没有将其设置count为一个数字,但我做到了。

下面是我的代码:

function LinkedList() {
    var head = null,
        tail = null,
        count = 0;

    var insert = function add(data)
    {
        // Create the new node
        var node = {
                data: data,
                next: null
        };

        // Check if list is empty
        if(this.head == null)
        {
            this.head = node;
            this.tail = node;
            node.next = null;
        }
        // If node is not empty
        else
        {
            var current = this.tail;
            current.next = node;
            this.tail = node;
            node.next = null;
        }

        this.count++;
    };

    return {
        Add: insert,
    };
}

var list = new LinkedList();
list.Add("A");
list.Add("B");
4

1 回答 1

2

thisinthis.count指的是 LinkedList 对象的实例。那个部分:

var head = null,
    tail = null,
    count = 0;

这些是私有变量,不被视为 LinkedList 对象的属性。

你想要做的是:

this.head = null;
this.tail = null;
this.count = 0;

这将使您可以做一个 LinkedList 对象的head属性。tailcountthis.count++

编辑:要保持head, tailcount作为 LinkedList 对象的私有,您的其他代码将是这样的:

// Check if list is empty
    if(head == null)
    {
        head = node;
        tail = node;
        node.next = null;
    }
    // If node is not empty
    else
    {
        var current = tail;
        current.next = node;
        tail = node;
        node.next = null;
    }

    count++;

还要记住,对象是按引用传递的。所以这适用于:

var current = tail;
current.next = node;
tail = node;
node.next = null;

更多:如果您想count成为公共财产,那么不要返回:

 return {
        Add: insert,
    };

你需要这样做:

this.Add = insert;
return this;

以便在创建对象时返回当前对象上下文。

于 2013-03-07T05:24:35.383 回答