如何扩展javascript对象?

时间:2011-12-04 07:59:17

标签: javascript

我用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对象的上下文,不是吗?

2 个答案:

答案 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();

http://jsfiddle.net/yRnLj/

尝试

我意识到这完全可以避免你有趣的问题。但是,如果您只需要每个语言包的一个副本,那么 就会简单得多。 : - )