令人惊奇的JavaScript面向对象(三)

 

 

本来打算去睡觉了,再打开blog一看,发现深夜了还有贵客来访。为感谢 真 OO无双 的关注,决定写完这篇再去睡觉~ 有什么错漏或者值得讨论的地方请大家不吝指出!

 

ok,其实昨天就打算写这一部分内容了,但是被那个所谓的“神奇现象”打乱了阵脚,看了MS的JScript文档之后才发觉是个笑话。不过不管怎么说,还是学到了东西呵呵,感谢昨天所有在此留言赐教的朋友呵呵~

 

 

接下来我为大家介绍一下JavaScript中的一些重要的面向对象特性或者基本的概念。(注意,我说的是面向对象“特性”,我并没有认为JavaScript是一门面向对象语言,但是它确确实实有面向对象语言方面的一些特性,这是值得我们利用的。)

 

1.成员变量。照例先看一段代码

 

 1  function  TestClass()
 2  {
 3       // “私有”成员变量
 4       var  val  =   1 ;
 5       // “公有”成员变量
 6       this .val  =   10 ;
 7      
 8       // 验证
 9      alert(val);
10      alert( this .val);
11  };
12 
13  // 声明一个对象
14  var  test  =   new  TestClass();
15  // 只能访问到公有成员
16  alert(test.val);

 

ok, 现在让我们看看什么是“公有”什么是“私有”。虽然大牛大虾们可能会不屑一顾,但是仍然写出来给大家提个醒,毕竟JavaScript这种定义类的方式有时候会让人摸不着头脑。

 

我原来的理解是这样的:如果用这个function来声明一个对象,这时候第4行val变量定义的上下文为构造函数内部,实际上是一个局部变量(大家看到这里先保留一下,后面大家会有其他认识)。而第6行声明的val上下文是对象内部,所以我们可以把它看成是成员变量。构造函数的最后两个alert验证了两个变量是属于不同上下文的变量。第16行的alert像我们展示了this.val这种形式声明的是一个公有的变量,因为我们可以通过对象从外部直接访问到它。至于为什么还有“私有”变量一说,请大家移步看下一个例子,第4行val的声明不仅仅是“局部变量”这么简单。

 

另外再唠叨一下,虽然和本文没多大关系:如果把function当成函数调用的话,第6行的上下文就是window对象,也即声明的是一个全局变量。

 

 

2.成员函数。只要理解了上述“公有”变量的定义方法,定义成员函数也成了顺理成章的事情。

 

 1  function  TestClass()
 2  {
 3       // “私有”成员变量
 4       var  val  =   1 ;
 5       // “公有”成员变量
 6       this .val  =   10 ;
 7      
 8       // 定义两个成员函数
 9       this .getPrivateVal  =   function () {
10           // 返回“私有”变量
11           return  val;
12      }
13       this .getPublicVal  =   function () {
14           // 返回“公有”变量
15           return   this .val;
16      }
17  };
18 
19  // 声明一个对象
20  test  =   new  TestClass();
21  // 两种变量都可以通过函数获取
22  alert(test.getPrivateVal());
23  alert(test.getPublicVal());

 

你可以看到,实际上所谓的“成员函数”其实就是上一点讲到的“公有”变量,仅仅是因为其类型是“function”而已。不过这一点可是需要牢记的东西,记住了才不会在书写JS代码的时候还用Java或者C++的风格去定义一个成员函数。

 

至于上一点中提到的“私有”变量的问题,可以看看getPrivateVal函数的定义以及其调用运行的结果。是不是很神奇?构造函数中的局部变量居然可以在构造函数之外“存活”? 又一个等待大牛大虾解决的问题呵呵~ 希望很快就能得到答复!

Anyway,我们可以把它当成“私有”变量使用。

 

ok,另外还有一种大家熟知的定义“可继承”函数的方法

function  TestClass()
{
    
// “私有”成员变量
     var  val  =   1 ;
    
// “公有”成员变量
     this .val  =   10 ;
};
// 定义一种可供“继承”的方法
TestClass.prototype.getVal  =   function () {
    
return   this .val;
}

// 声明一个对象
test  =   new  TestClass();
alert(test.getVal());

 

通过原型对象定义的方法。当然,这也是一种“公有”的方法。这样的定义方法更加受到欢迎。

 

在《精通JavaScript》一书中,把前一种方法称为“特权方法”,后一种方法才叫做“公有方法”。这两种方式定义的方法主要有两方面的差异,一个是继承特性,另一个是对构造函数中声明的变量(之前提到“私有”变量)访问的权限。

转载于:https://www.cnblogs.com/zhengchuyu/archive/2008/07/23/1249144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值