【问题标题】:Can derived classes have static get methods?派生类可以有静态get方法吗?
【发布时间】:2015-05-25 07:58:05
【问题描述】:

更新 2,添加要点

问题:派生类可以有static get 方法吗?
3 files here,尝试在派生类中使用static get 方法。在类的.es6 文件中访问时它可以正常工作,但在导入测试时不能正常工作。


我只是对 ES6 类语法有所了解,但在 ES5 原型继承中我很强大/很舒服。我正在研究一组树数据结构。使用巴别塔。

我有一个派生类,RBTree: (见下面的代码)

我希望 RBTree 有一个 static get 方法,它只是用作指向我已经创建的空节点的指针/属性。假设我从另一个文件中导入了该节点,它被称为NULL_POINTER

如何让这个静态 get 方法返回 NULL_POINTER

当我导入它并尝试像上面这样访问时,.null 返回undefined

我也尝试过在类表达式之外修改 RBTree (RBTree.nullPointer = //...),但不起作用。


更新 1
重命名了一些东西。更新代码以反映命名。 我有一个原始测试峰值的工作实现。以下是相关文件:

RBTree.es6

import {NULL_POINTER} from 'file/with/null/pointer'
export const _NULL_SENTINEL = new RBNode()// constructs the null node
export class RBTree extends BST {
  constructor() {

//...super call
  }

//...
  static get _nil() {
    return _NULL_SENTINEL;
  }
}

在我的 Jest 测试文件中:

const RBTree = require('../../../src/binary_trees/RBTree');
const RBNode = require('../../../src/binary_trees/RBNode');

当我使用 node-inspector 逐步完成测试时:
1.在RBTree.es6的底部,RBTree._nil工作正常。
2. 如果我在测试文件中的行之后放置一个调试器,RBTree._nil 返回undefined
3. RBTree._NULL_SENTINEL 是同一个对象。

1 和 3 正在按预期工作。
2 背后的原因是 RBTree 的 static get 函数在不同的范围内运行并且不再有权访问 _NULL_SENTINEL 吗? (由于两个单独的exports?)

我想在 RBTree 对象上附加一些东西,以便 static get 可以工作,但我不希望它是 this 上的指针。

【问题讨论】:

  • 您究竟是如何尝试访问它的,您确定NULL_POINTER 不是undefined?由于语法正确,NULL_POINTER 没有您认为的值,或者您没有正确访问它,或者您的转译器(如果您使用一个)出错了。
  • 我现在分别导出指针和RBTree,我可以访问它们,但我仍然无法让static get _nil() 函数工作。当我单步执行测试文件时,函数本身是undefined,我无法单步执行。这就是让我困惑的地方。
  • 将文件放入小提琴中,用 cmets 分隔 3 个文件。我的问题的失败测试/示例在底部。

标签: ecmascript-6 ecmascript-harmony


【解决方案1】:

您没有正确导入类。由于您使用的是 named 导出,因此您必须使用 named 导入。正如你通过RBTree._NULL_SENTINEL 看到的,所有的导出都变成了模块的属性。 (为什么_NULL_SENTINELRBTree 类的静态属性?你永远不会将它分配给RBTree


在 ES6 中是这样的

import {RBTree} from '../../../src/binary_trees/RBTree';

以及使用 CommonJS:

const RBTree = require('../../../src/binary_trees/RBTree').RBTree;

【讨论】:

  • 如何在 RBTree.es6 中创建预期的空节点并将其分配给 RBTree?
  • 说空节点分配给const _NULL_SENTINEL RBTree 类定义的上一行。 1. static get null() {return _NULL_SENTINEL} 会工作吗? 2. RBTree.null = _NULL_SENTINEL 在声明的类下面的一行(例如,在文件的最后一行)也可以吗?
  • 它们似乎不起作用(命名为导入,静态获取方法),但我认为这个问题已经完全回答,因为它与模块导入有关。谢谢。如果我有其他要点,我会添加到 cmets。
猜你喜欢
  • 2018-12-17
  • 2012-05-24
  • 2011-08-04
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多