如果我有这样的功能:
function foo(_this) {
console.log(_this);
}
function bar() {}
bar.prototype.func = function() {
foo(this);
}
var test = new bar();
test.func();
然后记录test
的{{1}}实例。
但是,要实现此目的,我必须在bar
函数中传递this
。我想知道是否有可能在没有传递bar.prototype.func
的情况下获得相同的this
值。
我尝试使用this
,但这会返回原型函数本身,而不是原型函数中的arguments.callee.caller
值。
是否可以通过仅在原型函数中调用this
来记录test
bar
实例?
答案 0 :(得分:4)
如果问题是“没有通过此(以任何方式)”,那么答案是否
值可以通过替代方法传递。例如,使用全局变量(在Bar类中)或会话或cookie。
function bar() {
var myThis;
function foo() {
console.log(myThis);
}
bar.prototype.func = function() {
myThis = this;
foo();
}
}
var test = new bar();
test.func();
答案 1 :(得分:1)
我认为在foo
的上下文中调用bar
应该有效:
function foo() {
console.log(this.testVal);
}
function bar() { this.testVal = 'From bar with love'; }
bar.prototype.func = function() {
foo.call(this);
}
var test = new bar();
test.func(); //=> 'From bar with love'
答案 2 :(得分:1)
这个怎么样?
"use strict";
var o = {
foo : function() {
console.log(this);
}
}
function bar() {}
bar.prototype = o;
bar.prototype.constructor = bar;
bar.prototype.func = function() {
this.foo();
}
var test = new bar();
test.func();
或者这个:
"use strict";
Function.prototype.extender = function( o ){
if(typeof o == 'object'){
this.prototype = o;
}else if ( typeof o == 'function' ) {
this.prototype = Object.create(o.prototype);
}else{
throw Error('Error while extending '+this.name);
}
this.prototype.constructor = this;
}
var o = {
foo : function() {
console.log(this);
}
}
function bar() {}
bar.extender(o);
bar.prototype.func = function() {
this.foo();
}
var test = new bar();
test.func();
答案 3 :(得分:0)
您可以在不更改外部功能的情况下执行此操作,但必须更改调用方式。
您无法获取调用者的上下文,但您可以使用方法apply或call在您调用的函数上设置this
属性。有关this
的解释,请参阅this reference。
function foo()
{
console.log( this );
}
function bar()
{
bar.prototype.func = function func()
{
foo.apply( this );
};
}
var test = new bar();
test.func();
通常使用this
时,它位于面向对象的上下文中。试图用另一个方法调用对象的方法可能表明设计不佳。为更适用的设计模式解释一下你想要实现的目标。
有关javascript OOP范例的示例,请检查my answer here。