javascript - 如何避免 ES6 Javascript 类继承命名冲突

标签 javascript inheritance ecmascript-6 es6-class

如何避免 ES6 Javascript 中类继承的命名冲突?

大型 ES6 Javascript 应用程序使用大量继承,以至于在基类中使用泛型名称可能意味着稍后在创建派生类时会出现令人头疼的调试问题。这可能是类设计不佳的产物,但似乎更多是 Javascript 能够顺利扩展的问题。其他语言提供了隐藏继承变量 (Java) 或属性 (C#) 的机制。缓解此问题的另一种方法是使用 Javascript 不具备的私有(private)变量。


这是此类碰撞的示例。一个 TreeObject 类扩展了一个事件对象(以继承事件功能),但它们都使用 parent 来存储它们的父对象。

class Evented {
    constructor(parent) {
        this.parent = parent;
    }
}
class TreeObject extends Evented{
    constructor(eventParent, treeParent) {
        super(eventParent);
        this.parent = treeParent;
    }
}

虽然这个例子有点人为,但我在像 Ember 这样的大型库中遇到过类似的冲突,其中库和最终应用程序之间的术语有很多重叠,导致我到处浪费时间。

最佳答案

这似乎确实是一个设计问题(使用较小的对象和更扁平的层次结构),但您的问题也有一个解决方案:符号!

const parentKey = Symbol("parent");
export class Evented {
    constructor(parent) {
        this[parentKey] = parent;
    }
}

import {Evented} from "…"
const parentKey = Symbol("parent");
class TreeObject extends Evented {
    constructor(eventParent, treeParent) {
        super(eventParent);
        this[parentKey] = treeParent;
    }
}

它们将可靠地防止任何冲突,因为所有符号都是唯一的,无论它们的描述符如何。

关于javascript - 如何避免 ES6 Javascript 类继承命名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171092/

相关文章:

Python 在新样式类中继承旧样式类型

javascript - 在 es6 的 Promise 中, '.catch(rejection)' 等于 '.then(null,rejection)' ?

reactjs - 为什么我可以访问 Redux 存储中的数组?

javascript - 是否可以显示隐藏的输入值?

javascript - 打印功能不起作用

javascript - 键入时自动选择数据列表中的第一个选项

json - TypeScript 在不公开字段的情况下定义 getter

javascript - 无法使用 jquery 和 php 设置 session ajax

C# 等效于 Delphi 的 "class"函数/过程

java - 如何在模式中正确声明扩展?