六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 110|回复: 0

遇到prototyte一个很怪异的问题,大家一起讨论一下(已解决,总结一下)

[复制链接]

升级  10%

1

主题

1

主题

1

主题

童生

Rank: 1

积分
5
 楼主| 发表于 2013-1-29 13:09:24 | 显示全部楼层 |阅读模式
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[n];                                        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[n];                                        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>

======================================================================
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表