cavenaghi 发表于 2013-1-29 13:09:24

遇到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]
查看完整版本: 遇到prototyte一个很怪异的问题,大家一起讨论一下(已解决,总结一下)