我在另一个函数上定义了一个函数,如此
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的解决方案。是不是有更优雅的方式来做到这一点?
答案 0 :(得分:1)
您必须使用call
或apply
,如下所示:
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;
}
请注意,这根本不利用原型。