论坛首页 Web前端技术论坛

领悟 JavaScript 中的面向对象

浏览 95882 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-06-02  
ggmmaallee 写道
csf178 写道
ggmmaallee 写道
玩文字游戏,一句话,不是强类型,不就完了

那是另一回事 别弄混了

那么不弄混的话,哪里不是面向对象的了

本来就是面向对象啊
前面说的好像没有涉及强类型弱类型吧
0 请登录后投票
   发表时间:2008-06-02  
顺便说下 楼主领悟的实在是有点问题
怎么把对象分成普通对象和方法对象了 汗一下
0 请登录后投票
   发表时间:2008-06-26  
让我收获不小
原来只晓得js处理网页效果
0 请登录后投票
   发表时间:2008-07-03  
很不错哦!呵呵!让我理解了以前不知道的东西。
0 请登录后投票
   发表时间:2008-07-11  
afcn0 写道
其实还有补充,就是如果构造函数返回object类型,那new对象无效,prototype问题是楼主还不太了解prototype继承方式,__proto__属性,以及isPrototypeOf方法所至


new对象并非无效!如果用类似下面的方法T=this 保存到变量T里,可以验证是有效的!

var A=function()
{
this.B="this.B"
}
A.C="A.C";

var T;

function D()
{
T=this;
this.E="this.E";
return A;
}

var X=new D();
explore(X);
explore(T);

准确的说 new 函数如果返回string,number,boll会被直接忽略无视,如果是返回object,array,function , 则不会返回刚创建的对象, 而是返回object,array,function , 但刚创建的对象确实有效!只是不加以利用回被丢弃掉!
0 请登录后投票
   发表时间:2008-08-04  
楼主辛苦了!这样的文章不错!提倡
0 请登录后投票
   发表时间:2008-08-19  
看一下这篇文章:
http://msdn2.microsoft.com/zh-cn/magazine/cc163419.aspx
0 请登录后投票
   发表时间:2008-12-27  
xieye 写道

"将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。"
其实并没有复制,之所以对象能够执行prototype 属性定义的方法,是因为用构造方法生成的对象和构造方法之间有紧密联系,对象寻找属性时,如果自己没有这个属性,会在构造方法的propotype所指向/引用的对象中找,看能否找到同名属性,如果找到,就会读取它的值并返回.(这个过程会持续向上,直到持续到Object对象为止,即所谓原型方式的继承).


我也觉得2. 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。这个解释应该不对的。看了楼上这段话,再加上自己的调试。觉得楼上理解很细致,受教了。

0 请登录后投票
   发表时间:2008-12-30  
ddviplinux 写道
  1. function invoke(f) {   
  2.     f();   
  3. }   
  4. invoke(func);  

楼主的这个函数调用有问题。

原因分析如下:

 invoke(f)作为一个方法,传了一个方法对象引用f是没错的,但是在函数体里有来了这么一句就有问题了f();

  既然传了一个方法对象的应用,那么它作为参数传进来的时候,构造方法就已经执行过了,在函数体里又执行

  构造方法,是错误,也是违背面向对象原则的。但是可以调用方法对象f的其它成员方法。

实例如下:

var  BankCard=function(cardId,cardPassword){
         this.card=cardId;  //银行卡NO
         this.cardPassword=cardPassword;// 银行卡密码
         this.balance=100; //银行卡余额
}
    BankCard.prototype={
          queryBalance:function(){
            return this.balance;
                        },
            setBalance:function(value){
             this.balance=this.balance+value;
                         },
           setPassword:function(password){
              this.cardPassword=password;
                         }
   }

 function   invoke(fun,value){
       fun.setBalance(value);
       balance=fun.queryBalance();
       alert(balance);
    }
//实例化一个银行卡对象
     var  objBankCard=new BankCard('admin','admin');
//传递对象引用,调用对象成员方法
      invoke(objBankCard,200);

 

 

看了这个,才知道lz写invoke函数的意义,我开始没有明白,现在知道了,有点反射的味道。不知道是否在将 function对象传入的时候就执行了构造函数?

如果按你这么说的,为何没有弹出两次Hello呢?

  

 

0 请登录后投票
   发表时间:2009-01-06  
太牛了!很形象!谢谢仁兄!
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics