遇到prototyte一个很怪异的问题,大家一起讨论一下(已解决,总结一下)
function Test(url) {this.url = url;this.str = "want to save responseText";}Test.prototype.test = function () {alert(this.url); //可以访问到alert(this.str); //可以访问到var ajax = new Ajax.Request(this.url,{method: "get",parameters: "time=" +new Date().getTime(),onSuccess: function(req){alert(this.url); //可以访问到alert(this.str); //无法访问到//this.str = responseText; //期待的操作无法执行}});};Event.observe(window, "load", pageLoad, false);var url = "a action url";function pageLoad(){ var t = new Test(url);t.test();}在这里我创建一个页面,并导入了prototype,和上面这段代码.并注册页面的初始化事件
初始化事件只是创建一个我自定义的对象,并调用其中的一个方法
而当我调用这个方法的时候,
alert(this.url);
alert(this.str);
这些都可以正常访问
而在new Ajax.Request内部,却只能访问到this.url.无法访问this.str
===================================================================
上面是问题的阐述,在cozone_柯中和7thbyte的热心帮助下,终于找到了问题的解决方案
===================================================================
首先,在prototype中加入下列代码
var ClassUtils=Class.create();ClassUtils.prototype={ _ClassUtilsName:'ClassUtils', initialize:function(){ }, /** * 给类的每个方法注册一个对类对象的自我引用 * @param reference 对类对象的引用 */ registerFuncSelfLink:function(reference){ for (var n in reference) { var item = reference; if (item instanceof Function)item.$ = reference; } }}
接着写我新的Test类
function Test(url) {this.url = url;this.str = "want to save responseText";new ClassUtils().registerFuncSelfLink(this);}Test.prototype.test = function () {var funcHolder=arguments.callee.$;alert(this.url); //可以访问到alert(this.str); //可以访问到var ajax = new Ajax.Request(this.url,{method: "get",parameters: "time=" +new Date().getTime(),onSuccess: function(req){alert(funcHolder.url); //可以访问到alert(funcHolder.str); //可以访问到funcHolder.str = responseText; //期待的操作可执行}});};Event.observe(window, "load", pageLoad, false);var url = "a action url";vat t = new Test(url);//这次把作用域扩大一下function pageLoad(){t.test();//可以了}function getTest(){alert(t.str);//可以随时察看一下,确实改变了,呵呵}
======================================================================
至此再次对cozone_柯中和7thbyte的热心帮助表示感谢
======================================================================
6月21号增加:
以上的解决方案太依赖于prototyte了,其实在平时的应用中this指针也是经常遇到的问题
现在将这部分独立出来,也可以解决了
<script language="javascript">function registerSelf(reference){ for (var n in reference) { var item = reference; if (item instanceof Function)item.$ = reference; } }var Book = function(){this.name = "book";}Book.prototype = {main : function(){alert(9);}}var Car = function(name){this.name = name;registerSelf(this)}Car.prototype = {getName : function(){var book = new Book();book.main();var self = arguments.callee.$; alert(self.name)book.main = function(){alert(self.name);}book.main();}}function main(){var car = new Car("boya");car.getName();}</script><a href="#" >do</a>
======================================================================
页:
[1]