如何使用 Ecmascript 6 类扩展对象文字类

Jan*_*sch 2 javascript nodes node.js javascript-objects ecmascript-6

我有一个class定义为 an的基础object literal,在构造函数的范围内定义了方法。像这样:

var NodeMappingAbstract = function NodeMappingAbstract() {

    this.mapToContent = function (obj) {
        throw new Error('Not implemented');
    };

    this.getInfo = function (data) {
        throw new Error('Not implemented');
    };

    this.normalizeUri = function normalizeUri(uri) {
        return uriNormalizer.normalize(uri);
    };
};
Run Code Online (Sandbox Code Playgroud)

如何NodeMappingAbstract使用 ES6class语法扩展?我尝试使用extendssuper()

class SomeMapping  extends  NodeMappingAbstract{
    constructor(){
        super();
    }

    mapToContent(rawElement) {
        console.warn('mapContent called');
        return rawElement;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我实例化它并mapToContent像这样调用时:

let m = new SomeMapping();
m.mapToContent();
Run Code Online (Sandbox Code Playgroud)

我得到Error: Not implemented,这意味着使用了 的实现NodeMappingAbstract

sdg*_*uck 5

这里的问题是您将方法直接附加到NodeMappingAbstract( this)的实例上,而不是prototype函数的 。

当 JavaScript 查找对象属性时,它首先检查对象直接自己的属性,这些属性在您将某些内容分配给this. 只有当它没有以这种方式发现该属性立即可用时,它才会转向prototype. 因此,尽管您正在(通过糖)扩展NodeMappingAbstract和定义方法,但您实际上并没有覆盖在内部实例化时分配给的属性。prototypeclassthisNodeMappingAbstract

因此,将方法声明移出函数体并移到其上prototype

var NodeMappingAbstract = function NodeMappingAbstract () {};

NodeMappingAbstract.prototype.mapToContent = function (obj) {
   throw new Error('Not implemented');
};

NodeMappingAbstract.prototype.getInfo = function (data) {
    throw new Error('Not implemented');
};

NodeMappingAbstract.prototype.normalizeUri = function normalizeUri (uri) {
    return uriNormalizer.normalize(uri);
};
Run Code Online (Sandbox Code Playgroud)