|
  
- UID
- 1
- 帖子
- 4814
- 精华
- 41
- 积分
- 555
- 阅读权限
- 200
- 来自
- 中国PHP联盟
- 在线时间
- 576 小时
- 注册时间
- 2007-12-10
- 最后登录
- 2010-7-29
|
今天明白了js里面new的含义了
- 今天明白了js里面new的含义了
- 以前比如我们创建一个对象,大概可以这样
- var ttt={"aaa":"sss","fun_1":function(){.....}}
- 或者
- var ttt={};.....
- 或者定义一个构造函数
- function aaa(){
- this.name="haha";
- this.fun=function(){
- alert("hello world");
- };
- }
- 然后再比如var e=new aaa();
- 以前一直不明白既然js里面没有class为什么还有new呢,并且还有delete比如可以delete(aaa.ccc)就删除了aaa对象的ccc方法或属性
- 今天看msdn终于明白了new是什么意思,其实就是这个样子
- new的含义:
- 比如刚才哪个例子可以这么写
- var e={};
- aaa.call(e);
- 大家可能不明白了,函数吗,直接()就可以了,为什么还.call()呢,其实关键就在call里面的参数一上了,这个call是把call前面的函数当作call里面参数一对象的一个方法来执行的,比如call里面参数一是sss,其实就是执行了sss.aaa=aaa;sss.aaa()这两句,然后呢执行完sss.aaa()后,自然那些this.什么的都执行了,自然新对象里面就有了构造函数的那些方法属性了其实aaa.call(sss)和 sss.aaa=aaa;sss.aaa()还是有点区别的,就是aaa.call并没有真正把aaa加到sss下面,可是sss.aaa=aaa;就真的把aaa加到sss下面了,虽然你也可以delete掉,但是其实实现的还是不一样地。
- 但是还是有不明白的地方,比如
- var t=new XMLHttpRequest();对吧
- 按我上面的分析XMLHttpRequest显示是一个构造函数,应该可以通过var t={};XMLHttpRequest.call(t)这样来new这个xhr对象,可是实际上XMLHttpRequest并没有.call方法,奇怪,并且比如t.a=XMLHttpRequest;再w.a()还是不行,报告a不是函数,看来显然我这分析还是针对构造函数的,可能对于 XMLHttpRequest这样的native function并不适用
- 另外一个例子
- >>> var ttt={"name":"hello","sss":function(){alert(this.name)}}
- >>> ttt.sss()
- >>> var eee={"name":"hahaha"}
- >>> ttt.sss.cal
- >>> ttt.sss.call
- call()
- >>> ttt.sss.call(eee)
- 太奇异了,js的组合太有意思了,看来要理解它还需要再努力呀
复制代码 |
|