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

Cob*_*urn 3 javascript inheritance ecmascript-6 es6-class

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

大型ES6 Javascript应用程序使用大量继承,以至于在基类中使用通用名称可能意味着在创建派生类时稍后调试头痛.这可能是糟糕的类设计的产物,但似乎更容易成为Javascript能够顺利扩展的问题.其他语言提供隐藏继承变量(Java)或属性(C#)的机制.缓解此问题的另一种方法是使用私有变量,这不是Javascript所具有的.


这是这种碰撞的一个例子.TreeObject类扩展了一个Evented对象(继承了公平的功能),但它们都parent用来存储它们的父对象.

class Evented {
    constructor(parent) {
        this.parent = parent;
    }
}
class TreeObject extends Evented{
    constructor(eventParent, treeParent) {
        super(eventParent);
        this.parent = treeParent;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 6

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

const parentKey = Symbol("parent");
export class Evented {
    constructor(parent) {
        this[parentKey] = parent;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

它们将可靠地防止任何碰撞,因为所有符号都是唯一的,无论其描述符如何.

  • 这个问题的唯一*目标*答案. (3认同)