[英]How to extend an object literal class with Ecmascript 6 classes
我有一个定义为object literal
的基class
,其方法在构造函数的作用域内定义。 像这样:
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);
};
};
如何使用ES6 class
语法扩展NodeMappingAbstract
? 我尝试使用extends
和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
,这意味着使用了NodeMappingAbstract
的实现。
这里的问题是您将方法直接附加到NodeMappingAbstract
( this
)的实例上,而不是函数的prototype
上。
当JavaScript对某个对象属性执行查找时,它首先检查这些对象的直接自身属性,这些属性是在您向this
分配某些内容时可用的。 只有当它没有发现以这种方式立即可用的属性时,它才会转向prototype
。 因此,尽管您正在扩展NodeMappingAbstract
并在prototype
上定义方法(通过class
NodeMappingAbstract
),但实际上并没有覆盖NodeMappingAbstract
实例化时this
分配的属性。
因此,将方法声明移到函数体之外并移至其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);
};
您应该将方法放在ES5类的原型上(一如既往)。
如果在构造函数中定义它们,并将它们创建为实例属性(遮盖从原型继承的任何内容),则在覆盖它们时必须执行相同的操作:
class SomeMapping extends NodeMappingAbstract{
constructor(){
super();
this.mapToContent = function(rawElement) {
console.warn('mapContent called');
return rawElement;
};
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.