如何在javascript中创建自定义对象的公共常量实例?

如何在javascript中创建自定义对象的公共常量实例?,javascript,constants,Javascript,Constants,我正在创建一个用javascript表示二进制搜索树的程序。我想要的是一种创建公共树节点的方法,其中两个ptr(左、右)都为null。这是我写的代码: 是指在调用inoorder方法时,在到达left或right=null的节点时,由于试图运行null.inoorder(func),它会给出一个TypeError自,此.left转换为null 解决方法是修改inoder函数,这将导致每个语句出现许多条件,即不是一个非常优雅的实现。 我还可以在对象的原型之外定义inOder,并将树作为参数,即i

我正在创建一个用javascript表示二进制搜索树的程序。我想要的是一种创建公共树节点的方法,其中两个ptr(左、右)都为null。这是我写的代码:

是指在调用
inoorder
方法时,在到达
left或right=null
的节点时,由于试图运行
null.inoorder(func),它会给出一个
TypeError
自,
此.left
转换为
null

解决方法是修改
inoder
函数,这将导致每个语句出现许多条件,即不是一个非常优雅的实现。
我还可以在对象的原型之外定义
inOder
,并将树作为参数,即
inOder(tree,func)
,但我不想这样做

此外,作为代码的第二个改进,请考虑<代码> INSER/<代码>方法;在

null
情况下:

if (this.data === null){
    this.data  = data;
    this.left  = new BST(null);
    this.right = new BST(null);
}
由于我必须重写每个条目,因此我希望通过执行以下操作将此节点重新分配到一个新的树:

if (this.data === null)
    this = new BST(data);

我知道与前者相比,这是一个效率较低的实现,但它仍然要简洁得多。那么有什么方法可以做到这一点呢?

是的,在这种情况下,您可以使用常量实例,因为所有空节点都是相同的,并且没有不同的引用(如“父”属性)。要创建这样一个常数,你需要一个地方来存储它;它可以是(私有)变量或类似的变量

BST.emptyleaf = new BST(null);
var BST = function(data) {
    this.insert(data);
};

BST.prototype.insert = function(data) {
    if (typeof this.data == 'undefined') {
        this.data = data;
    } else if (data < this.data) {
        if (!this.left) {
            this.left = new BST();
        }
        this.left.insert(data);
    } else if (data > this.data) {
        if (!this.right) {
            this.right = new BST();
        }
        this.right.insert(data);
    }
};

BST.prototype.inOrder = function(func) {
    if (typeof this.data != 'undefined') {
        this.left && this.left.inOrder(func);
        func(this.data);
        this.right && this.right.inOrder(func);
    }
};
您也可以使用单例模式:

function BST(data) {
    if (data === null || data === undefined) {
        if (BST.emptyleaf)
            return BST.emptyleaf; // singleton instance if available
        this.data  = null;
        this.left  = null;
        this.right = null;
        BST.emptyleaf = this; // else create it for re-use
    } else {
        this.data  = data;
        this.left  = new BST(null);
        this.right = new BST(null);
    }
}
但是对于每个空节点,我必须创建一个表示相同数据的新节点。有没有办法分配给空节点的公共实例

是的,但这会破坏你的密码。想想看:当您在该节点实例上调用
insert
方法时会发生什么

至于第二个问题,您无法使用当前模型对其进行优化。不存在就地对象替换()

我认为您当前的代码还可以,不过我个人还是坚持使用更简单的模型,比如

BST.emptyleaf = new BST(null);
var BST = function(data) {
    this.insert(data);
};

BST.prototype.insert = function(data) {
    if (typeof this.data == 'undefined') {
        this.data = data;
    } else if (data < this.data) {
        if (!this.left) {
            this.left = new BST();
        }
        this.left.insert(data);
    } else if (data > this.data) {
        if (!this.right) {
            this.right = new BST();
        }
        this.right.insert(data);
    }
};

BST.prototype.inOrder = function(func) {
    if (typeof this.data != 'undefined') {
        this.left && this.left.inOrder(func);
        func(this.data);
        this.right && this.right.inOrder(func);
    }
};
var BST=函数(数据){
本节插入(数据);
};
BST.prototype.insert=函数(数据){
if(typeof this.data==“未定义”){
这个数据=数据;
}else if(数据<此数据){
如果(!this.left){
this.left=新的BST();
}
此.左.插入(数据);
}else if(数据>此.data){
如果(!this.right){
this.right=new BST();
}
本.右.插入(数据);
}
};
BST.prototype.inoorder=函数(func){
if(this.data的类型!=“未定义”){
this.left&&this.left.inoorder(func);
func(这个数据);
this.right&&this.right.inoorder(func);
}
};

请注意,这完全消除了对
nullNode
的需要,因为-hey!-它是JavaScript,所以为什么不使用诸如未定义的
和动态对象扩展之类的奇妙功能呢。

您不能将
分配给该
,而是需要操作父节点。