为什么说JavaScript是基于对象的语言?

    “JavaScript不是面向对象的语言”

    我想说这句话的时候,没有人反对。

    那么什么是面向对象?

    简单地讲,“面向对象就是把现实中的事物抽象化”,“面向对象这个词也许让它叫做面向抽象更加贴切”。

    定义一: 面向对象方法是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。

    定义二: 面向对象方法是以认识论为基础,用对象来理解和分析问题空间,并设计和开发出由对象构成的软件系统(解空间)的方法。 由于问题空间和解空间都是由对象组成的,这样可以消除由于问题空间和求解空间结构上的不一致带来的问题。简言之,面向对象就是面向事情本身,面向对象的分析过程就是认识客观世界的过程。

    JavaScript中有对象的概念吗?

    有,看看这样的脚本,这样写是正确的:

var obj = new Object();
obj.width 
= 12;
alert(obj.width);

    但是JavaScript没有继承的概念,进而也没有多态的概念,事实上,每个JavaScript对象是相同基类的实例。

    很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)缺一不可,通常“基于对象”使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点,而“多态”是表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”,缺少了继承和多态的特性,JavaScript就只是个基于对象的语言。

2006-10-30记:
今天在看jQuery.js时。看到prototype.js相关的一点东西,说到JavaScript的继承。可能我一开始就错了,希望没有误导别人,内容如下:

类的继承其实javascript本身就支持的,不过prototype提供了一种另外的方法。
按照javascript的支持的实现:

var Student=Class.create();
      Student.prototype
=new Person();

      这样就实现了Student继承至Person。
      在使用prototype的情况下可以这么实现:

      var Student=Class.create();
      Object.extend(Student.prototype,Person.prototype);

      子类要增加方法时可使用

Student.prototype.study=function(){};

      或 

Object.extend(Student.prototype,{
           study:
function(){}
 }
);

 

posted on 2006-09-13 21:28  三千  阅读(2504)  评论(7编辑  收藏  举报