我将$(".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
?我尝试使用class
和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
的实现。
答案 0 :(得分:4)
这里的问题是您将方法直接附加在NodeMappingAbstract
(this
)的实例上,而不是函数的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;
};
}
}