论坛首页 Web前端技术论坛

领悟 JavaScript 中的面向对象

浏览 95885 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-04-15  
  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);

 

  

0 请登录后投票
   发表时间:2008-04-21  
这居然就叫面向对象和继承了,呵呵,看似很抽象的东西居然被楼主说的这样灵活,佩服佩服
0 请登录后投票
   发表时间:2008-04-21  
很不错的文章,补充一点:
js对象的属性一般这样获取
var a = new A();
alert(a.name);
也可以这样获取
var a = new A();
alert(a['name']);
第二种方法虽然不常用,但是它提供了一种反射机制,可以用在不知道对象的属性名称的情况下,用变量来反射属性或者用变量给对象的属性赋值。
0 请登录后投票
   发表时间:2008-05-06  
总结的很不错啊!!感谢楼主的分享!
0 请登录后投票
   发表时间:2008-05-15  
witchxg 写道
   var o= {}; // 我发现了一个东西。
o.eat = function(){return "I am eating."};  // 我发现它会吃;
o.sleep = function(){return "ZZZzzz..."} ; // 我发现它会睡;
o.talk = function(){return "Hi!"}; // 我发现它会说话;
o.think = function(){return "Hmmm..."}; // 我发现它还会思考。

var Human = new Function(); // 我决定给它起名叫“人”。
Human.prototype = o; // 这个东西就代表了所有“人”的概念。


var h = new Human(); // 当我发现其他同它一样的东西,
o.talk=function(){return "changed!"};
alert(h.talk());
结果显示是changed

Human.i=3;
h=new Human();
alert(h.i);结果是undifined
学习一番后结论就是:原型是引用自上层函数可以一直追溯到object的原型,而非原型的部分是由上层函数的构造函数copy至当前函数。


有意思的是
Function Human()
{
this.i=3;
}
用alert(Human.i)居然访问不到
而 alert(new Human().i)则可以

以function f()
{
this.test1=1;
}
f.test2=2;
f.prototype.test3=3;
ff= new f();
为例
所以对象函数f应该分为3个部分,分别是test1,test2,test3。
ff没有构造函数,ff.test1=1;并且ff.prototype.test3=3;而test2的数据无法取到了。


初学者看了这篇之后找了一些资料得出的结论,不知道对不对,请指教。

ff.prototype.test3=3 , 这个应该也是找不到才对吧,因为ff的prototype里没有东西
应该是ff.test3=3才对,因为ff复制了f的prototype里的属性到自己,直接使用就好了
我也是初学者,说的不对请指正
0 请登录后投票
   发表时间:2008-05-21  
zengsun 写道
楼主注意!!! Javascript是基于对象的语言!不是面向对象的语言!!! Javascript没有明确的类的概念,但可以模拟。


楼上这句话是否太过专断?

刚才在别处看到:

JS自己的语言标准说的很清楚是面向对象 就在正文第一页(PDF第13页) 原文是这样写的
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment.

基于对象这个词我就没有查到是什么意思,也不清楚用它来形容JS是什么意思。"JS是基于对象的,而非面向对象的"这个说法我没有在任何权威资料中发现(当然如果发现就太奇怪了,有什么资料会直接否定语言的标准文档呢)。
0 请登录后投票
   发表时间:2008-06-01  
高深点的了?
0 请登录后投票
   发表时间:2008-06-02  
玩文字游戏,一句话,不是强类型,不就完了
0 请登录后投票
   发表时间:2008-06-02  
ggmmaallee 写道
玩文字游戏,一句话,不是强类型,不就完了

那是另一回事 别弄混了
0 请登录后投票
   发表时间:2008-06-02  
csf178 写道
ggmmaallee 写道
玩文字游戏,一句话,不是强类型,不就完了

那是另一回事 别弄混了

那么不弄混的话,哪里不是面向对象的了
0 请登录后投票
论坛首页 Web前端技术版

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