我用babel对象做了一个简单的例子:
function babel(){
this.english = {
hello: function () { alert('hello'); },
goodbye: function () { alert('goodbye'); }
teeshirt: function () { alert('T-shirt'); }
}
}
现在,我想扩展这个对象:
babel.prototype.french = {
bonjour: function () { alert('bonjour'); },
aurevoir: function () { alert('au revoir'); }
}
但是如果我之前需要使用现有函数定义怎么办?
babel.prototype.french = {
bonjour: function () { alert('bonjour'); },
aurevoir: function () { alert('aurevoir'); },
teeshirt: function () { this.english.teeshirt(); }
}
我能做的是:
var say = new babel();
(function (_this) {
babel.prototype.french = {
bonjour: function () { alert('bonjour'); },
aurevoir: function () { alert('aurevoir'); },
hello: function () { _this.english.hello(); }
}
})(say);
但是在这种情况下,我会一直使用say对象的上下文,不是吗?
答案 0 :(得分:4)
问题是,在teeshirt函数调用中,这指向法国对象,而不是babel对象。如果必须访问父对象,则应该在某处存储对它的引用。例如,您可以像这样更改构造函数:
function babel(){
this.english = {
parent: this,
hello: function () { alert('hello'); },
goodbye: function () { alert('goodbye'); }
teeshirt: function () { this.parent.french.something(); }
}
}
但正如您所看到的,如果您不在构造函数中创建对象,则会出现问题。我没有看到任何“好”的方法,但你可以这样做:
function babel(){
this.english = {
parent: this,
hello: function () { alert('hello'); },
goodbye: function () { alert('goodbye'); }
teeshirt: function () { this.parent.french.something(); }
};
for (var i in babel.prototype) {
this[i].parent = this;
}
}
然后你的法语会是这样的:
babel.prototype.french = {
bonjour: function () { alert('bonjour'); },
aurevoir: function () { alert('aurevoir'); },
teeshirt: function () { this.parent.english.teeshirt(); }
}
答案 1 :(得分:2)
虽然问题确实提出了JavaScript this
和原型继承的所有引人入胜的问题,但我建议简化整个问题并重构对象。有几种方法可以做到这一点。
如果teeshirt的英文版本是默认版本,则应该位于原型链 end 的对象中。也就是说,法国对象的原型是英文对象。法国物体根本不包含teeshirt成员。这类似于资源包的工作方式。
现在这个想法可能不适合你,因为不同捆绑包之间的关系可能很复杂:有时候Engish有时候是,但有时候却不是其他时间。在这种情况下,看看你是否可以让你的babel对象成为所有单身(即,只是普通对象)。
var babel = {}
babel.english = {
hello: function () { alert('hello'); },
goodbye: function () { alert('goodbye'); },
teeshirt: function () { alert('T-shirt'); }
}
babel.french = {
bonjour: function () { alert('bonjour'); },
aurevoir: function () { alert('aurevoir'); },
teeshirt: function () { babel.english.teeshirt(); }
}
babel.english.teeshirt();
babel.french.teeshirt();
尝试
我意识到这完全可以避免你有趣的问题。但是,如果您只需要每个语言包的一个副本,那么 就会简单得多。 : - )