放下对象 立地成佛——浅析JS的OOP

[size=large][color=blue]JavaScript简介[/color][/size]
[size=medium]通常,现代的Web可以划分为三大元素:CSS、HTML,当然还有JavaScript,这基本上可以说是一种模块化的思想:我们用CSS来使我们的页面对得起观众,我们用HTML让网页言之有物,而JavaScript让我们的页面看起来生动,也即功能的实现。这种JavaScript我们称之为不唐突的JavaScript。
JavaScript,顾名思义,是一种script language(脚本语言),当然,它和Java并没有一毛钱的关系,这个只是NetScape(网景)公司市场部的馊主意,为了提高这门语言的知名度,单相思地改为了JavaScript,但是我不明白,在JavaEye更名为ITEye之后,JavaScript为什么不更名为ITScript 。这个名字的一个后果就是很多刚入门学Java的同学在图书馆会拿上一本JavaScript的书,一不小心就误入歧途了(或许这正是市场部希望看到的)。好吧,回到JavaScript的定义上来,它是一门跨平台、基于原型的面向对象的脚本语言(什么是基于原型的面向对象语言等会解释),这也是JavaScript的一大优势。当然,很多书本和论坛都会强调JavaScript是一种弱类型的语言,也就是说变量可以在不声明的情况下使用,这是因为JavaScript不像Java那样需要通过编译才能运行,它是通过解释器解释后运行的,因此JavaScript也是解释性语言,它的变量会在解释器工作时进行数据类型检测。(莫非JavaScript的老爸才是李刚,这么嚣张,竟然可以不事先声明变量的类型,而且也不用更换名字)。JavaScript的合法定义或许应该这么说:JavaScript是一门弱类型、基于原型的面向对象的、解释性的脚本语言。它的语法和Java等语言类似,运行环境一般是web浏览器。[/size]

[size=large][color=blue]JavaScript中的对象[/color][/size]
[size=medium]对象,相信接触过Java、C#等OOP语言的同志都明白,说来说去,就是由属性和方法组成的嘛。这里不展开讲我对对象的理解了,就JavaScript论JavaScript的对象吧还是。
我们一般将JavaScript中可操作的对象划分为两种:一种是JavaScript的核心对象(数组对象、日期时间对象等),另一种是JavaScript宿主环境定义的各种对象。或者,可以从广义上讲,JS中都是对象,管你function还是其它什么玩意,统统看成对象,这就是人们常说的万物皆是对象。
一般说来,JavaScript的核心对象(又称内置对象)有以下八种:
◎Array对象:用来表示数组的对象;
◎Boolean对象:用以支持布尔值;
◎Date对象:时间日期对象;
◎Math对象:用以支持一些常用的数学函数;
◎Function对象:函数支持对象;
◎String对象:字符串对象;
◎Number对象:提供对数字支持的对象;
◎RegExp对象:正则表达式对象;
以上八种核心对象,除了Math之外,其它七种JavaScript都提供了具有构造器功能的一个实例化机制(有些观点认为那就是构造器,因为可以通过它们new出这些对象,比如date = new Date(),但是我认为这只是具有构造器的功能而已,它们还是有区别的,最显而易见的区别就是我们可以date = new Date;这样来创建一个对象,此时,就不能说这是一个构造函数了)。当然,和大多数的语言一样,Math都是直接调用其中的方法的,这就不难理解了。
而用户自定义的对象就是通过定义一个函数来创建对象。这时,就得讨论function(函数)的对象化能力了(有一种观点认为在JS中,只有object和function才具有对象化的能力)。函数具有对象的特征,比如:
function dog(){
this.name = "Snoopy";
this.age = 5;
this.bark = function(){alert("Wow wow");}
}; // end dog
dog1 = new dog(); // 创建一个dog对象
从这个实例可以看出,这个函数dog具有属性和方法,是不是又可以对其进行实例化呢。此时,又有好事者指出,这个不就像Java中的构造器吗?好吧,如果你认为这样有利于记忆和理解的话。但是,需要记住的是,函数可以动态的为对象增加或删除属性和方法,这些属性可以是对象。
其实,我们根本没有必要纠结于一些名词,什么构造器、实例化机制啊,都只是一些表象,看到事物的本质才是关键,西藏有一个大喇嘛曾经说过:迷惑我们的不是事物本身,而是我们本身对事物的执着。也许,在看清了本质后就会发现,程序也不就是人类的思想+计算机的语言吗,那些C、C++、Java、C#、PHP等等各种计算机语言都是人类一种对计算机的抽象思维的具象表达。而且,过分地关注那些表面的东西很容易让我们变得浮躁从而无法接近事物的真相。[/size]

[size=large][color=blue]JavaScript中的对象表示方法[/color][/size]
[size=medium]JavaScript中,常用的对象表示方法有两种,一种是比较熟悉的new,还有一个就是JSON。想必new一个对象大家伙是很在行的,比如在上面的例子中,我们就是通过new关键字来创建一个dog对象的。
这里着重讲另外一种很有用的对象表示法——JSON,其英语全称是JavaScript Object Notation,也即JavaScript对象表示法。JSON是一种轻量级的数据交换语言,是对象的一种序列化表示形式,简洁而明了,而JSON字符串是通过eval引擎转化为JS对象的。它的基本格式是:
var object = {
property1: pro1, // 属性1
property2: pro2, // 属性2
function1: fun1, // 函数1
function2: fun2 // 函数2
};
当然,我们还可以嵌套使用这种对象定义方式:
var object1 = {
property1: pro1,
function1: fun1,
object2: {property2: pro2, function2: fun2}; // 嵌套定义
};
这种JS对象声明方法相对来说比较易懂清晰。但是也有一个缺点:缺乏灵活性。这也算是JSON的美中不足之处吧。[/size]

[size=large][color=blue]JavaScript的面向对象特性[/color][/size]
[size=medium]首先声明,我也是接触JavaScript才知道面向对象编程还分为两种:基于类的面向对象编程和基于原型的面向对象编程。像Java、C#这种属于基于类的面向对象语言,而JavaScript则属于基于原型的面向对象语言。
基于类的面向对象语言包括两个基本概念:类和实例。类是一个很抽象的概念,简单说是具有相同属性和近似功能的事物的一种归约。而实例就是类的一个特例,即类的一个具体对象。而在基于原型的面向对象语言中,只有一个概念,那就是对象,它还有一个很重要的概念——原型对象。
原型的概念需要重点强调。原型这个概念,相信大家接触过,以前学习语文课本中的小说时,经常会说主人公是以谁谁谁为原型的,小说的主人公B是以现实中A为原型,那么就说明B具有A的一些性格或经历。其实,从语义上,这两个原型是相通的,只是JavaScript原型得更彻底,JavaScript中,如果A是B的原型,那么B将具有A的所有属性和方法。JavaScript中的每一个对象都拥有一个原型对象作为参照对象,而且每一个函数有一个prototype属性,然后通过该属性引用原型对象。其实,原型对象就是一个对象模板。原型对象相对于类进行实例化具有一个很明显的优势——节省内存开销,我们知道,我们在用类实例化一个对象时,不管你用不用某个属性,它总是存在的,而当通过使用prototype,我们并不会在创建一个对象时将属性和方法附加在对象上,而是在对象调用某个属性或方法时,再去检测该对象是否具有所调用的属性或方法。
一般地,基于类的面向对象语言都具有三大特点:继承、封装以及多态。这些特征相信接触过Java或C++等面向对象语言的读者应该很清楚,不少人甚至将这些作为判断一种编程语言是否是面向对象语言的标准,但是这些仅仅是基于类的面向对象语言的特征而已,在JavaScript中,这三者只有继承独活于世了。没有类,怎么实现继承?我想,我们是时候突破类的限制了,n年前,我们的祖先的祖先类人猿正是因为突破了类的限制——直立行走,才让今天的我们可以淡定地取笑着敲代码的程序猿。没有类,我们还有原型不是吗?是的,我们就是通过原型链接来实现JavaScript中的继承的。先看看下面的代码吧:
// 定义一个Animal
function Animal(){
this.name= "";
this.age = "";
} // end Animal
// 定义一个Dog
function Dog(){
this.bark = "Wowwow";
} // end Dog
// 通过原型实现继承
Dog.prototype = new Animal();
// 创建一个Dog对象
var dog = new Dog();
// 打印dog对象具有的属性
for(var obj in dog){
document.write("属性:", obj);
} // end for
这段代码的运行结果是:
name
age
bark
Dog通过原型从Animal那里继承了Animal的两个属性,看看,这不也是继承吗?当然,方法也是可以继承的。这就是JavaScript的继承,相信理解了这个,也就不难明白为什么JavaScript也是面向对象语言了。

希望通过以上的阐述,大家已经对JS的面向对象特性以及JS的一些特点有了一些理解。理解了JS的一些基本真相,对于JS的深入学习相信也是大有裨益的。由于本人能力有限,文中难免会有疏漏之处,望大家不吝指正,在此先行谢过了。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值