javascript中的lf和this⽤法⼩结
那天⽤到于是打开看看,才看⼏⾏就满头雾⽔,原因是对js的⾯向对象不是很熟悉,于是百度+google了⼀把,最
后终于算⼩有收获,写此纪念⼀下^_^。
代码⽚段
代码如下:
varClass={
create:function(){
returnfunction(){
(this,arguments);
}
}
}
//Class使⽤⽅法如下
varA=();
ype={
initialize:function(v){
=v;
}
showValue:function(){
alert();
}
}
vara=newA(‘helloWord!');
lue();//弹出对话框helloWord!
linitialize是什么?
lapply⽅法是⼲什么的?
larguments变量呢?
l为什么newA后就会执⾏initialize⽅法?
寻找答案:
initialize是什么?
只不过是个变量,代表⼀个⽅法,⽤途是类的构造函数。
其具体功能靠js的⾯向对象⽀持,那么js的⾯向对象是什么样⼦的那?和java的有什么相同与不同?
看代码:
代码如下:
复制代码代码如下:
varClassName=function(v){
=v;
ue=function(){
;
}
ue=function(v){
=v;
}
}
那么JS中的函数和类有什么不同呢?
其实是⼀样的,ClassName就是⼀个函数,当出现在new后⾯的时候就作为⼀个构造函数来构造对象。
如
代码如下:
varobjectName1=newClassName(“a”);//得到⼀个对象
其中objectName1就是执⾏ClassName构造函数后得到的对象,⽽在ClassName函数中的this指的就是new之后构造出来的对
象,所以objectName1会后⼀个属性和两个⽅法。可以通过这样来调⽤他们:
代码如下:
ue(''hello'');
alert(ue());//对话框hello
alert();//对话框hello
那么
代码如下:
varobjectName2=ClassName(“b”);//得到⼀个对象
这样objectName2得到的是什么呢?显然是⽅法的返回值,这⾥ClassName只作为了⼀个普通的函数(虽然⾸字母⼤写
了)。但是在之前写的ClassName中并没有返回值,所以objectName2会是undifinded那么“b”赋给谁了呢?在这并没有产⽣
⼀个对象,⽽只是单纯的执⾏这个⽅法,所以这个“b”赋值给了调⽤这个⽅法的对象window,证据如下:
varobjectName2=ClassName(“b”);//得到⼀个对象
alert();//对话框b
所以JS中的所有function都是⼀样的,但是⽤途可能是不同的(⽤作构造对象抑或是执⾏⼀个过程)。
下⾯该回到主题了initialize是⼲什么的?
代码如下:
复制代码代码如下:
varClass={
create:function(){
returnfunction(){
(this,arguments);
}
}
}
varA=();
这段代码是构造个⼀个function复制给A,这个function是
代码如下:
复制代码代码如下:
function(){
(this,arguments);
}
并且后⾯这个⽅法是⽤来做构造函数的。当使⽤这个构造函数来构造对象的时候,会让构造出来的这个对象的initialize变量执
⾏apply()⽅法,apply()的⽤途后⾯在说,继续说initialize。这样在初始化对象的时候会联系到initialize(怎么联系就要看apply
的了)。
那么
代码如下:
复制代码代码如下:
ype={
initialize:function(v){
=v;
}
showValue:function(){
alert();
}
}
是什么意思呢?
Prototype是“原型”的意思。A是⼀个function(),那么ype,就是function中的⼀个变量,其实是个对象。这个对象拥
有什么⽅法,那么function产⽣的对象就拥有什么⽅法,故
vara=newA(‘helloWord!');
lue();//弹出对话框helloWord!
所以a对象也会有initialize⽅法,不只如此,每⼀个有A构造出来的对象都会有⼀个initialize⽅法,⽽在前⾯说过,构造的时候
会调⽤构造函数,构造函数⾥⾯会让initialize去调⽤apply⽅法,于是在newA(‘helloWord!')的时候initialize回去调⽤apply⽅
法。这也就是调⽤了⼀个初始化的⽅法。
下⾯开始研究apply(),在⽹上找了⼏个资料,并结合⾃⼰的研究,了解了call()和apply()的功能。功能基本⼀
样,function().call(object,{},{}……)或者function().apply(object,[……])的功能就是对象object调⽤这⾥的funciton(),不同之处是
call参数从第⼆个开始都是传递给funciton的,可以依次罗列⽤“,”隔开。⽽apply只有两个参数,第⼆个是⼀个数组,其中存
储了所有传递给function的参数。
(this,arguments);
是什么意思?
这⾥的第⼀个this,是指⽤new调⽤构造函数之后⽣成的对象,也就是前⾯的a,那么第⼆个this也当然应该是指同⼀个对象。
那这句话就是this(也就是a)调⽤initialize⽅法,参数是arguments对象(参数的数组对象),所以在构造函数执⾏的时候,
对象a就会去执⾏initialize⽅法来初始化,这样就和单词“initialize”的意思对上了。
那么执⾏initialize⽅法的参数怎么传递进去的呢?
这段代码能说明⼀切了:
代码如下:
复制代码代码如下:
functiontest(){
alert(typeofarguments);
for(vari=0;i<;i++){
alert(arguments[i]);
}
}
test("1","2","3");
test("a","b");
执⾏后alert(typeofarguments);会显⽰object,说明arguments是对象。然后会依次打出1、2、3。说明arguments就是调⽤函
数的实参数组。
代码如下:
复制代码代码如下:
varClass={
create:function(){
returnfunction(){
(this,arguments);
}
}
}
arguments就是create返回的构造函数的实参数组,那么在
vara=newA(‘helloWord!');
的时候‘helloWord!'就是实参数组(虽然只有⼀个字符串),传递给⽅法apply,然后在调⽤initialize的时候作为参数传递给初
始化函数initialize。
本文发布于:2022-11-24 17:26:41,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/13222.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |