如何在 javascript 中创建自定义对象的通用常量实例
How to create a common constant instance of a self-defined object in javascript?
我正在创建一个程序来表示javascript中的二叉搜索树。我想要的是一种创建公共树节点的方法,其中 ptrs(左、右)均为 null。这是我写的代码:
var BST = function(data) {
if (data === null || data === undefined){
this.data = null;
this.left = null;
this.right = null;
}
else{
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
};
BST.prototype.insert = function(data) {
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
else if (data < this.data)
this.left.insert(data);
else if (data > this.data)
this.right.insert(data);
};
BST.prototype.inOrder = function(func) {
if (this.data !== null) {
this.left.inOrder(func);
func(this.data);
this.right.inOrder(func);
}
};
在这里,我想为所有空指针分配一个空节点(如if(data === null || data === undefined)
条件中所定义)。但是对于每个空节点,我必须创建一个表示相同数据的新节点。有没有办法分配给空节点的公共实例?
我使用空节点而不是仅使用
else{
this.data = data;
this.left = null;
this.right = null;
}
是在调用 inOrder
方法时,在到达具有 left or right = null
的节点时,它会给出一个TypeError
,因为它尝试运行 null.inOrder(func);
,因为this.left
转换为 null
.
解决方法是修改 inOrder
函数,这将导致每个语句周围出现许多条件,即不是一个非常优雅的实现。
我还可以在对象的原型之外定义inOrder
,并使其将树作为参数,即 inOder(tree,func)
,但我不想那样做。
此外,作为对代码的第二个改进,请考虑insert
方法;在 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);
我知道这将是前者效率较低的实现,但它仍然更加简洁。那么有什么办法可以做到这一点吗?
但是对于每个空节点,我必须创建一个表示相同数据的新节点。有没有办法分配给空节点的公共实例?
是的,但这会破坏您的代码。想一想:当您在该节点实例上调用 insert
方法时会发生什么?...
至于第二个问题,您无法使用当前模型对其进行优化。没有就地对象替换这样的东西(在 C# 中有)。
我认为您当前的代码还可以,尽管我个人会坚持使用更简单的模型,例如
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);
}
};
请注意,这完全消除了对nullNode
的需要,因为 - 嘿!- 它是JavaScript,所以为什么不使用undefined
和动态对象扩展这样奇妙的东西。
是的,在这种情况下,您可以使用常量实例,因为所有 null 节点都是相同的,并且没有不同的引用(如"父"属性)。要创建这样的常量,您需要一个存储它的地方;可以是(私有)变量或类似的东西
BST.emptyleaf = new BST(null);
您也可以使用单例模式:
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);
}
}
- ES6构造函数返回基类的实例
- KnockoutJS-组件-多个实例
- 为什么无法在TypeScript中导出类实例
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- fluxxor向一个flux实例添加一组以上的操作
- 使用jQuery获取Dropzone实例/对象
- "实例范围”;TypeScript类的getter/setter
- 如何在速度模板中获取LiferayPortlet实例id
- 同一项怎么可能在一个实例中未定义,却在另一个实例上定义
- 实例创建(JS)
- 显示模块模式在Knockout中设置模型的新实例
- 如何获取单选按钮的多个实例的选定单选按钮值
- 当同一浏览器的两个实例浏览时,Javascript页面如何具有唯一的ID
- 在哪里可以找到RXUI Javascript'时间飞逝'实例
- spine.js在启动时填充模型实例
- 不再需要时使用jQuery/kill实例
- 如何在用户输入时实例化数组
- 如何在 javascript 中创建自定义对象的通用常量实例
- CoffeeScript 类中的实例变量和常量
- 为什么在实例模式下使用p5.js时没有定义常量?