关于AJAX的一些问题,求解答~~

Lisen_1987 2010-08-10 12:31:27
这两天刚开始学习AJAX,在看Prototype框架的时候,里面有段这样的代码

var Class={
create:function(){
return function(){
this.initialize.apply(this,arguments);
}
}
}

然后还举了例子:

var A=Class.create();
A.prototype={
initialize:function(x){
this.value=x;
}
}


我就这两段代码一直想不明白
this.initialize.apply(this,arguments);这句应该怎么理解,
var A=Class.create();这里是不是应该就相当于
var A=function(){
this.initialize.apply(this,arguments);
}
那这段代码应该怎么理解,为什么下面A的prototype对象里还有一个initialize,越看越乱~~
...全文
117 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Go 旅城通票 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lisen_1987 的回复:]
那我是不是可以这样理解,因为Class.create里面有这句this.initialize.apply(this,arguments);,所以通过这句var A=Class.create();也就是确定了A类里面一定必须要有initialize方法,然后在A.prototype对象里具体再来写实现initialize方法的代码
[/Quote]

差不多这个意思,不过构造函数里面什么代码都可以放,也可以不放。而且并不一定在prototype中申明initialize方法,也可以在Class.create中返回的函数体中申明。
var Class={
create:function(){
return function(){
this.initialize=function(x){this.value=x;}//注意顺序,要不出错误,在构造函数体内调用方法时,方法一定要先申明,这个和其他面向对象语言如C#等是不同的,js是解释性的
this.initialize.apply(this,arguments);
}
}
}
var A=Class.create();
var a=new A(1);
alert(a.value)



如果构造函数里面调用了类里面的方法,你就得有这个方法的定义。
如果未放任何代码,你就得手动调用这个方法来初始化类实例里面的变量。

其实prototype的例子就是简化了一下,在构造函数中随便调用了初始化方法来初始一些变量的值。

构造函数中调用了类中的initialize来初始化变量
var Class={
create:function(){
return function(){//构造函数体内调用initialize方法
this.initialize.apply(this,arguments);
}
}
}

var A=Class.create();
A.prototype={
initialize:function(x){
this.value=x;
}
}
//==因为在构造函数中调用了initialize方法,所以给构造函数中传递值就可以进行初始化了
var a=new A(1);
alert(a.value);


构造函数中调用类中的initialize来初始化变量,那么你就得手动调用initialize来初始化变量
var Class={
create:function(){
return function(){//返回一个空的构造函数体
}
}
}

var A=Class.create();
A.prototype={
initialize:function(x){
this.value=x;
}
}
//==因为未构造函数中调用了initialize方法,所以需要附加的代码才能初始化类变量value的值
var a=new A(1);//即使你给构造函数传递了值也没用,因为构造函数中未调用任何函数来执行初始化
alert(a.value);//此时的输出为undefined
a.initialize(1);//附加代码,调用初始化方法
alert(a.value);//此时的输出为1
Lisen_1987 2010-08-11
  • 打赏
  • 举报
回复
to showbo:
上面你说的我明白了,到了这里我又有个问题,

var A=function(){
this.initialize.apply(this,arguments);
}

这里A这个类里面的this.initialize.apply(this,arguments);是不是声明A这个类里面有一个函数initialize,还是别的什么意思,我看书里,apply这个函数是说把函数绑定到另外一个对象上去运行,那这句应该怎么理解,在一开始A这个类里面都还没有initialize这个函数啊,它怎么绑定?我就是这里一直想不明白~~
TaoTaoYou 2010-08-11
  • 打赏
  • 举报
回复
本人没有使用过Prototype框架.对其代三结构组织与功能不太了解.不过从你提供的代码上分析来看:

var Class={
create:function(){
return function(){
this.initialize.apply(this,arguments);
}
}
}


上面的代码可以称作为一个对象.或一个类.名称是Class
然后在Class定义了一个方法.方法的名称是:create 在该方法内又有了一个新方法initialize,并让this指向该方法的本身.也就是传递过来的每个参数.都指向当前的方法中.而不是Class
我这样解释不知道大家有没有不同意见.望拍砖...


var A=Class.create();
A.prototype={
initialize:function(x){
this.value=x;
}
}



这段代码.你可以理解为.a变量对Class中的create()方法的引用..
Go 旅城通票 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lisen_1987 的回复:]
to IBM_hoojo:
我想请问一下
var Class={
create:function(){
return function(){
this.initialize.apply(this,arguments);
}
}
}
var A=Class.create();
代码执行到这里,A里面有些什么东西,是个空函数吗?
[/Quote]

A其实就是,A并不是实例,执行Class.create()后A其实就等于
var A=function(){
this.initialize.apply(this,arguments);
}


只是把创建A这种类通过Class.create来创建而已,让你看的有点莫名奇妙而已

创建A的示例
var a=new A(1);
alert(a.value);
  • 打赏
  • 举报
回复
这样说是不容易说清楚的.
UML就是为了解决类似问题而设计出的方法,通过画图,理清各个对象(包括函数)之间的关系,就方便理解了.
楼主可以把这些JS里的对象,以及它的各个函数,画出来,用线连接.
在画之前,重点是要明白一个简单明显的问题,THIS对象对于每个函数的意义,以及当在不同函数中需要传递同一个THIS对象的时候,应该怎么做.在网上查"JS THIS详解",看几篇文章就懂了.回头再画图,就能理解各函数之间的关系了.
Lisen_1987 2010-08-11
  • 打赏
  • 举报
回复
那我是不是可以这样理解,因为Class.create里面有这句this.initialize.apply(this,arguments);,所以通过这句var A=Class.create();也就是确定了A类里面一定必须要有initialize方法,然后在A.prototype对象里具体再来写实现initialize方法的代码
Go 旅城通票 2010-08-11
  • 打赏
  • 举报
回复
简单点说吧

Class.create负责创建A类的构造函数的代码,而不是创建A类的实例。

在Class.create返回的构造函数体中有this.initialize.apply(this,arguments);,因为在构造函数中,只有在创建实例的时候才会执行这句代码,调用initialize方法,所以在创建A对象的实例时一定要放到prototype下面,要不会出错。
Lisen_1987 2010-08-11
  • 打赏
  • 举报
回复
分数不够我可以再加,这个问题我非得弄明白不可~~
Lisen_1987 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 showbo 的回复:]
不是申明initialize这个方法,而是在实例化A的实例时调用A类原型链prototype定义的方法initialize,initialize已经在原型链上定义了。所以你实例化A类的对象时,实例化代码一定要放到prototype下面,要不会找不到对象,因为还没有申明这个方法,导致出错。
[/Quote]
那我这里不明白了,为什么实例化A类的对象时会调用initialize,是因为Class类里面的那个this.init.apply(this,arguments);吗,为什么有这个在实例化A的时候会执行到它?
Go 旅城通票 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lisen_1987 的回复:]
to showbo:
上面你说的我明白了,到了这里我又有个问题,

JScript code

var A=function(){
this.initialize.apply(this,arguments);
}



这里A这个类里面的this.initialize.apply(this,arguments);是不是声明A这个类里面有一个函数initialize,还是别的什……
[/Quote]
  不是申明initialize这个方法,而是在实例化A的实例时调用A类原型链prototype定义的方法initialize,initialize已经在原型链上定义了。所以你实例化A类的对象时,实例化代码一定要放到prototype下面,要不会找不到对象,因为还没有申明这个方法,导致出错。如下
var A=Class.create();
//不能在这里实例化,因为还未在原型链prototype上定义initialize方法
//var a=new A(1);
//alert(a.value)
A.prototype={
initialize:function(x){
this.value=x;
}
}
//===========这里实例化,没问题
var a=new A(1);
alert(a.value)


  如果你不在类的主体内直接定义方法,那么就得在A类默认属性prototype上定义方法,目前我知道就这2中定义类方法。

  并不一定使用initialize作为方法名称,你可以使用init其他什么的,但是如果你修改后就得注意将Class.create中返回的类构造函数中执行的方法名称。

例如
var Class={
create:function(){
return function(){
this.init.apply(this,arguments);//=======返回类构造函数主体
}
}
}

var A=Class.create();

A.prototype={
init:function(x){//========定义原型链上的init方法
this.value=x;
}
}
var a=new A(1);
alert(a.value)


至于apply方法,网上一搜索一大把,下面给个参考
http://www.code-design.cn/search.aspx?s=javascript+apply+call&t=blog
Lisen_1987 2010-08-11
  • 打赏
  • 举报
回复
to IBM_hoojo:
就是看了还是不明白,所以才来问的呀~~~
hoojo 2010-08-11
  • 打赏
  • 举报
回复
看js的prototype原型和js面向对象,你就知道了initialize
zoujp_xyz 2010-08-10
  • 打赏
  • 举报
回复
1.this.initialize.apply(this,arguments);这句应该怎么理解,
搜下apply的使用
2.var A=Class.create();这里是不是应该就相当于
这个是有关闭包的一些知识

可以找些资料把原理弄懂。
Lisen_1987 2010-08-10
  • 打赏
  • 举报
回复
to IBM_hoojo:
我想请问一下
var Class={
create:function(){
return function(){
this.initialize.apply(this,arguments);
}
}
}
var A=Class.create();
代码执行到这里,A里面有些什么东西,是个空函数吗?
hoojo 2010-08-10
  • 打赏
  • 举报
回复

this.initialize.apply(this,arguments);这句应该怎么理解,
这个是在当前对象initialize初始化时候,给当前的对象添加arguments参数
apply会将参数设置到对象中,arguments是传递参数的对象数组

var A=Class.create();这里是不是应该就相当于
var A=function(){
this.initialize.apply(this,arguments);
}

Class.create就是调用这个方法
create:function(){
return function(){
this.initialize.apply(this,arguments);
}
}

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧