在JavaScript中将此对象传递给内部函数

时间:2015-02-19 05:06:00

标签: javascript node.js

我在另一个函数上定义了一个函数,如此

function Test(message) {
    this.message = message;
}

Test.prototype.print = function() {
    console.log(this.message);
}

Test.prototype.print.polite = function() {
    console.log(this.message + ', please.');
}

var x = new Test('hello world');

x.print();
x.print.polite();

x.print()按预期打印'hello world',但x.print.polite()打印'undefined,please',而不是'hello world,please'。

据我所知,这是因为传递给print.polite函数的上下文是print函数。然而,是否有一种方法可以从print.polite访问'this'的print,而不是明确地将它作为参数添加?我想保留print.polite()的调用语义,而不是使它成为printPolite()。

我对JavaScript很新,所以如果这是一个无聊的问题我会道歉。

修改

基于这些建议,我已经修改了我的代码,它似乎有效。

function Test(message) {
    this.message = message;
    this.print.that = this;
}

Test.prototype.print.polite = function() {
    console.log(this.that.message + ', please.');
}

但是,正如你指出的那样,这是一个相当hacky的解决方案。是不是有更优雅的方式来做到这一点?

2 个答案:

答案 0 :(得分:1)

您必须使用callapply,如下所示:

Test.prototype.print.polite.call(x);

这将函数Test.prototype.print.polite调用x作为上下文或this值,而不是参数。

答案 1 :(得分:0)

可以保持调用语义,但实现可能有点难看。

function Test(message) {
    var local = this;

    this.message = message;
    this.print = function() {
        console.log(local.message);
    };

    this.print.polite = function() {
        console.log(local.message + ", please.");
    };

    return this;
}

请注意,这根本不利用原型。