添加不是函数

add is not a function

我不知道为什么会出现此错误,我正在使用 github 中的 trie.js 并尝试使用添加功能,但它说 trie.add 不是'不是函数。

var longestWord = function(words) {
    console.log('test');
    let trie = new Trie();
    trie.add("test");
    console.log(trie);
};


longestWord('testing');

function Trie() {
    this.head = {
            key : ''
        , children: {}
    }
}

Trie.prototype.add = function(key) {

    var curNode = this.head
        , newNode = null
        , curChar = key.slice(0,1);

    key = key.slice(1);
    
    while(typeof curNode.children[curChar] !== "undefined" 
        && curChar.length > 0){
        curNode = curNode.children[curChar];
        curChar = key.slice(0,1);
        key = key.slice(1);
    }

    while(curChar.length > 0) {
        newNode = {
                key : curChar
            , value : key.length === 0 ? null : undefined
            , children : {}
        };

        curNode.children[curChar] = newNode;

        curNode = newNode;

        curChar = key.slice(0,1);
        key = key.slice(1);
    }

};

Trie.prototype.search = function(key) {
    var curNode = this.head
        , curChar = key.slice(0,1)
        , d = 0;

    key = key.slice(1);

    while(typeof curNode.children[curChar] !== "undefined" && curChar.length > 0){
        curNode = curNode.children[curChar];
        curChar = key.slice(0,1);
        key = key.slice(1);
        d += 1;
    }

    if (curNode.value === null && key.length === 0) {
        return d;
    } else {
        return -1;
    }

}

Trie.prototype.remove = function(key) {
    var d = this.search(key);
    if (d > -1){
        removeH(this.head, key, d);
    }
}

function removeH(node, key, depth) {
    if (depth === 0 && Object.keys(node.children).length === 0){
        return true;
    } 

    var curChar = key.slice(0,1);

    if (removeH(node.children[curChar], key.slice(1), depth-1)) {
        delete node.children[curChar];
        if (Object.keys(node.children).length === 0) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

我自己添加的所有代码都在函数Trie()之前。其余部分来自此 github 回购:https://gist.github.com/alexandervasyuk/b12c3d2c306539decb2a#file-trie-js

您的代码应移至 Trie 声明和原型初始化之后。

Trie 构造函数 (Trie) 声明将被提升到代码块的顶部。因此,您的代码可以成功地用它实例化一个新对象。但是,在您尝试 use 对象时,Trie 原型尚未初始化。原型初始化语句只是普通语句,因此它们将在 调用 longestWord().

之后执行

因此,如果您将当前在 function Trie ... 之前的所有内容移动到整个代码块的末尾,它应该可以工作(除非出现其他错误)。

您在向新 Trie 添加原型之前调用它。

这是工作版本:

https://jsbin.com/jokekuw/3/edit?js,output

var longestWord = function(words) {
    console.log('test');
    let trie = new Trie();
    trie.add("test");
};

function Trie() {
    this.head = {
            key : ''
        , children: {}
    }
}