JavaScript-如何保存“的状态”;这";适当地
我有以下代码用于js学习: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(“我是一个头痛的人,在我的
函数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()方法
test1()方法的行是“B().test2();“。因此它称为next B() 2.1)B()
当我们到达B()的末尾(即返回self)时,“this”对象内容如下:
- “窗口”对象的所有属性/方法
- 函数的test1()方法
[A的problem()方法丢失,因为它被B的problem()覆盖] - B的test2()和problem()方法
它按预期运行并正常运行。因此,我们找到了一个()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
作为构造函数ievar A=new A()
,然后这将指向一个新对象而不是窗口您需要使用A
作为构造函数ievar 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
有时也可以使用。@icktoofaybind
在ECMAScript 5中;因此它在旧浏览器上不可用。顺便问一下,如何将它绑定到一个新对象(即复制新对象)?对不起,我不是说你可以复制new
。我是说你可以使用bind
变量而不是。至于浏览器兼容性,它很容易填充。函数。prototype.bind
有时也可以使用。@icktoofaybind
在ECMAScript 5中;因此它不可用