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

时间:2016-05-18 07:38:11

标签: javascript node.js ecmascript-6 nodes javascript-objects

我将$(".avatar-image-container img[src='http://img2.blogblog.com/img/b16-rounded.gif']").attr("src", "https://2.bp.blogspot.com/-fMGj0xxU17A/VzwRIi8g6DI/AAAAAAAAFLo/qhnNcpj4eq0oIo3pW0zAeuKLvLXiRKLsACLcB/s1600/no-photo.jpg"); 定义为class,并在构造函数范围内定义了方法。像这样:

object literal

如何使用ES6 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); }; }; 语法扩展NodeMappingAbstract?我尝试使用classextends

super()

但是当我实例化它并像这样调用class SomeMapping extends NodeMappingAbstract{ constructor(){ super(); } mapToContent(rawElement) { console.warn('mapContent called'); return rawElement; } } 时:

mapToContent

我得到let m = new SomeMapping(); m.mapToContent(); ,这意味着使用Error: Not implemented的实现。

2 个答案:

答案 0 :(得分:4)

这里的问题是您将方法直接附加在NodeMappingAbstractthis)的实例上,而不是函数的prototype

当JavaScript执行对象属性的查找时,它首先检查对象的直接属性,这些属性是在向this分配内容时可用的属性。只有当它没有找到以这种方式立即可用的属性时,它才会转向prototype。因此,虽然您要扩展NodeMappingAbstract并在prototype上定义方法(通过class糖),但实际上并没有覆盖分配给this的属性NodeMappingAbstract内的实例化。

因此,将方法声明移到函数体之外并移到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);
};

答案 1 :(得分:2)

您应该将您的方法放在ES5类的原型上(如您所愿)。

如果在构造函数中定义它们,并将它们创建为实例属性(从原型继承的任何阴影),则在覆盖它们时必须执行相同的操作:

class SomeMapping  extends  NodeMappingAbstract{
    constructor(){
        super();
        this.mapToContent = function(rawElement) {
            console.warn('mapContent called');
            return rawElement;
        };
    }
}