JavaScript-如何保存“的状态”;这";适当地

JavaScript-如何保存“的状态”;这";适当地,javascript,jquery,this,Javascript,Jquery,This,我有以下代码用于js学习: 函数A(){ var self=这个; this.test1=函数(){ console.log(“A_test1”); B().test2(); 回归自我; } this.problem=函数(){ log(“我从未接到过电话”); } 回归自我; } 函数B(){ var self=这个; this.test2=函数(){ console.log(“B_test2”); 回归自我; } this.problem=函数(){ log(“我是一个头痛的人,在我的

我有以下代码用于js学习:

函数A(){
var self=这个;
this.test1=函数(){
console.log(“A_test1”);
B().test2();
回归自我;
} 
this.problem=函数(){
log(“我从未接到过电话”);
}
回归自我;
}
函数B(){
var self=这个;
this.test2=函数(){
console.log(“B_test2”);
回归自我;
}  
this.problem=函数(){
log(“我是一个头痛的人,在我的空闲时间会覆盖其他人”);
}
回归自我;
}
/*
*这是C中的“主要”函数
*/
$(函数(){
A().test1().problem();
});
我已经用Firebug调试了代码。让我们一步一步地检查“main”函数下面的行:A().test1().problem()

1) A()
关键字“this”不是函数(类)对象。它始终是“window”对象,在运行时由当前对象的属性/方法逐行扩展(在本例中为:a的函数对象)。因此,当我们到达a()的末尾时(即“return self”),该“this”对象的内容如下:

  • “窗口”对象的所有属性/方法
  • 的test1()和problem()方法
2) A().test1()
test1()方法的行是“B().test2();“。因此它称为next B()

2.1)B()
当我们到达B()的末尾(即返回self)时,“this”对象内容如下:

  • “窗口”对象的所有属性/方法
  • 函数的test1()方法
    [A的problem()方法丢失,因为它被B的problem()覆盖]
  • B的test2()和problem()方法
2.2)B().test2()
它按预期运行并正常运行。因此,我们找到了一个()test1()

3) A().test1().problem();
这将调用B的problem()方法,尽管我想在这里调用A的problem()

那么,保存“this”对象的联机状态的正确方法是什么? (很明显,“self”在这里没有任何作用,因为它是对“this”对象的引用(如在C中)

我可以在每个构造函数的开头克隆“this”-对象的状态,即:
而不是

var self = this;
怎么样

var self = this.clone();
但是我不确定这是否是一个好主意,因为克隆每个新创建的对象的“this”状态会杀死大型框架中的内存,不是吗


我肯定我不是第一个遇到这个问题的人。我的谷歌搜索没有给我太多。那么,保存“这个”的正确方法是什么?在这个例子中,我如何让A的问题()被调用,而不是B的问题()呢?

如果您在函数上调用
new
,那么
这个
实际上将是对象的一个实例,而不是窗口…因此

function Foo(){
   this.whatAmI = function(){
         console.log("I am " + this);  
   }
}


var bar = new Foo();
bar.whatAmI();

如果在函数上调用
new
,那么
这个
实际上是对象的一个实例,而不是窗口…所以

function Foo(){
   this.whatAmI = function(){
         console.log("I am " + this);  
   }
}


var bar = new Foo();
bar.whatAmI();

您需要使用
A
作为构造函数ie
var A=new A()
,然后这将指向一个新对象而不是
窗口

您需要使用
A
作为构造函数ie
var A=new A()
,然后这将指向一个新对象而不是
窗口

var x = new A();
javascript中的
new
关键字具有将
this
变量设置为新实例的功能。如果只使用
var x=a();
中的
this
函数将是
窗口
(即全局上下文)

对于这些简单的设置,在需要回调之前不需要使用
var self=this;
,但为了方便起见,可以在没有任何副作用的情况下使用。将变量的值设置为this以使其一致是完全正确的,而且非常常见,变量的名称通常是
that
而不是
self
bu那只是糖

javascript中的
new
关键字具有将
this
变量设置为新实例的功能。如果只使用
var x=a();
中的
this
函数将是
窗口
(即全局上下文)

对于这些简单的设置,在需要回调之前不需要使用
var self=this;
,但为了方便起见,可以在没有任何副作用的情况下使用。将变量的值设置为this以使其一致是完全正确的,而且非常常见,变量的名称通常是
that
而不是
self
bu这只是糖。

其他答案(“使用<代码>新”)是正确的

我想你会从John Resig的作品中受益。看看他的书()或在他的网站上查看。

其他答案(“使用<代码>新建”)是正确的


我想你会从John Resig的作品中受益。看看他的书()或在他的网站上查看。

你需要使用
a
作为构造函数,即
var a=new a()
,然后
这个
将指向一个新对象,而不是
窗口
@ArunPJohny:将其作为答案发布。你需要使用
a
作为构造函数,即
var a=new a()
,然后
这个
将指向一个新对象,而不是
窗口
@ArunPJohny:将其作为答案发布。
函数.prototype.bind
有时也可以使用。@icktoofay
bind
在ECMAScript 5中;因此它在旧浏览器上不可用。顺便问一下,如何将它绑定到一个新对象(即复制新对象)?对不起,我不是说你可以复制
new
。我是说你可以使用
bind
变量而不是
。至于浏览器兼容性,它很容易填充。
函数。prototype.bind
有时也可以使用。@icktoofay
bind
在ECMAScript 5中;因此它不可用