网站推广 网站,网页制作培训教程,谷德设计网展示设计,网站建设投标书服务方案范本js的oop其实很简单#xff0c;function本身就充当了类和构造函数的角色。然后通过传给构造函数的参数#xff0c;完成类属性的赋值#xff0c;从而实际化不同的对象。可是#xff0c;js的oop也有很让人头疼的地方#xff0c;其中之一就是this的指向。在js中#xff0c;普… js的oop其实很简单function本身就充当了类和构造函数的角色。然后通过传给构造函数的参数完成类属性的赋值从而实际化不同的对象。 可是js的oop也有很让人头疼的地方其中之一就是this的指向。在js中普通的函数this指向的是window对象因为所有的全局函数都是window对象的方法。而对于类和对象中的方法this指向的是这个类和对象。可是this指针并不是那么老实的如果在一个类中的方法调用了另一个类的方法那么这个this的指向就变得很奇怪了。举个简单的例子。var a 0;function test(){ this.a123; this.b function() { alert(this.a); }this.init function(){alert(this.a); setTimeout(this.b,1000);}this.init();}var adang new test(); 你猜结果会是什么一开始弹出一个123,然后一秒后又弹出一个123??错一开始的确是弹出123,一秒后弹出的却是0!因为setTimeout是window对象的方法所以做为参数被传入setTimeout方法的this.b()函数运行的闭包空间对象是window而不再是test类this指针指向了window也就是说里面的alert(this.a)等于window.a,而不是test.a。 这的确有点让人费解。想来想去想到的一个解释是这样的因为js中对复杂数据类型是通过传址方式进行赋值的所以setTimeout中的第一个参数也就是要运行的函数是传递的this.b()这个方法的地址给setTimeout方法使用的这个地址保存的是this.b方法中的所有字符是个string!!!然后再在setTimeout内部用eval(str)来运行。这么一来this关键字完全没有连到test类的地址而是直接使用新闭包的对象。 这个问题应该怎么解决呢如果我想在setTimeout里正确运行test类的b方法正解调用test的属性应该怎么做呢方法很简单去掉this,把a由this.a换成var a让它从一个公开属性变成私有属性因为a定义在test内部的最外一级所以它的作用域是整个test类类里的b方法可以调用到它。而它又去掉了this关键字不会错误地指到别的对象上。 总结一下心得就是在用oop方式写js的时候少用this关键字除了必要的方法和属性写成公开属性/方法应该尽量用var 定义成私有属性/方法。 转载于:https://www.cnblogs.com/cly84920/archive/2008/07/12/4427145.html