`
风子柒
  • 浏览: 56483 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

阅读更多
JavaScript简介
   通常,现代的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浏览器。


JavaScript中的对象
   对象,相信接触过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等等各种计算机语言都是人类一种对计算机的抽象思维的具象表达。而且,过分地关注那些表面的东西很容易让我们变得浮躁从而无法接近事物的真相。


JavaScript中的对象表示方法
   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的美中不足之处吧。


JavaScript的面向对象特性
   首先声明,我也是接触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的深入学习相信也是大有裨益的。由于本人能力有限,文中难免会有疏漏之处,望大家不吝指正,在此先行谢过了。
4
1
分享到:
评论
1 楼 中南大宝 2013-09-30  
学长写的很好,学习了!

相关推荐

    C++ Builder 5高级编程技术——IDE与OOP编程

    C++ Builder 5是一款强大的集成开发环境(IDE),专为C++编程设计,它结合了 Borland 的编译器技术和Visual Component Library (VCL)框架,使得对象导向编程(OOP)在Windows平台上更加高效。本篇文章将深入探讨C++ ...

    冒号课堂——编程范式与OOP思想

    主要的编程范式有过程式、函数式、面向对象(OOP)以及声明式等。本讲义将深入探讨编程范式及其核心思想,尤其是重点讲解面向对象编程(Object-Oriented Programming,简称OOP)。 过程式编程是最基础的编程范式,...

    javascript oop模式讲解

    JavaScript OOP(面向对象编程)模式是编程领域中一种重要的设计思想,它允许开发者通过类和对象来组织和管理代码,提高代码的可重用性和可维护性。在这个讲解中,我们将深入探讨JavaScript中的OOP模式,特别是如何...

    JavaScript与OOP js面向对象教程.ppt

    JavaScript与OOP js面向对象教程.ppt

    《冒号课堂——编程范式与OOP思想》电子书.txt

    根据提供的文件信息,本文将对《冒号课堂——编程范式与OOP思想》电子书进行深入解析,重点探讨编程范式与面向对象编程(Object-Oriented Programming, OOP)的相关概念及其在实际开发中的应用。 ### 编程范式与OOP...

    oop(面向对象程序设计)考试题

    首先,我们要了解OOP的基石——类与对象。类是对象的模板,定义了一组属性(数据成员)和方法(成员函数)。对象则是类的实例,具备类所描述的特性和行为。创建类和对象,是实现OOP的基础。 封装是OOP的首要原则,...

    JavaScript OOP 课程库.zip

    JavaScript OOP 课程库JavaScript 面向对象编程Telerik Academy的JavaScript OOP课程库JavaScript OOP是关于构建低级用户界面的。本课程涵盖 DOM、jQuery、事件、使用 HTML5 Canvas 和模板的图形和动画等主题课程...

    JavaScript的面向对象特性浅析与范例.pdf

    "JavaScript面向对象特性浅析与范例" JavaScript是一种基于原型的解释型语言,它允许在任意时刻给一个对象添加任意多的属性和方法。 JavaScript的面向对象特性是指它可以实现面向对象编程的部分特性,而不是完全...

    《面向对象程序设计——Java语言》电子课件(程细柱PPT)

    《面向对象程序设计——Java语言》是一门深入探讨如何使用Java进行面向对象编程的课程,由知名讲师程细柱制作的PPT电子课件。面向对象编程(Object-Oriented Programming,简称OOP)是现代软件开发中的核心编程范式...

    labview面向对象封装的视觉函数oop

    在描述中提到的“面向对象封装的视觉函数OOP”是指利用LabVIEW的面向对象编程特性来封装视觉处理功能。面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过类和对象的概念来组织代码,使得...

    Java 对象头(认识oop+oop的继承体系+InstanceOopDesc+arrayOopDesc+markword)

    在 Java 中,oop 是一个基本的数据结构,用于存储对象的元数据。oop 有多个继承类,包括 instanceOopDesc、arrayOopDesc、objArrayOopDesc 和 typeArrayOopDesc 等。其中,instanceOopDesc 是普通 Java 对象的对象头...

    jsoop:Javascript 面向对象编程库

    "JSoop"库的出现就是为了弥补JavaScript在面向对象编程(OOP)方面的不足,使开发者能够更方便地构建复杂的OOP结构。 JSoop库提供了类、继承、封装、多态等核心的面向对象特性,使得JavaScript开发者可以按照传统...

    Visual C++ 面向对象编程教程——王育坚

    《Visual C++ 面向对象编程教程——王育坚》是一本专为学习MFC(Microsoft Foundation Classes)和面向对象编程技术而设计的教学资料。该教程以幻灯片的形式呈现,结合实例与详细的讲解,使得学习过程更为直观且易于...

    我的C#面对对象编程学习文档与近百道oop试题

    在IT领域,C#是一种广泛使用的面向对象编程(OOP)语言,特别是在Windows应用程序和游戏开发中。这个压缩包文件提供了丰富的资源,帮助你深入理解C#中的面向对象编程概念,以及如何通过实践来巩固这些知识。 标题...

    LABVIEW面线对象——咖啡店.zip

    面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法封装在一起,形成对象。在LabVIEW中,对象是由VI(Virtual Instruments)和类簇(Class Cluster)实现的。VI作为对象,...

    js 面向对象实例

    面向对象编程(Object-Oriented Programming,简称OOP)是JavaScript中的核心概念,它允许开发者通过对象来组织和管理代码,提高代码的可重用性和可维护性。本实例将深入探讨JavaScript的面向对象特性,并结合HTML5...

Global site tag (gtag.js) - Google Analytics